Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: hot reload ios support for navigationbar #1354

Draft
wants to merge 5 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions samples/Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,19 @@
<PackageVersion Include="Uno.Extensions.Logging.WebAssembly.Console" Version="1.8.0-dev.1" />
<PackageVersion Include="Uno.Material" Version="5.3.0-dev.4" />
<PackageVersion Include="Uno.Material.WinUI" Version="5.3.0-dev.4" />
<PackageVersion Include="Uno.UI" Version="5.5.87" />
<PackageVersion Include="Uno.UI.Adapter.Microsoft.Extensions.Logging" Version="5.5.87" />
<PackageVersion Include="Uno.UI.RemoteControl" Version="5.5.87" />
<PackageVersion Include="Uno.UI.Skia.Gtk" Version="5.5.87" />
<PackageVersion Include="Uno.UI.Skia.Wpf" Version="5.5.87" />
<PackageVersion Include="Uno.UI.WebAssembly" Version="5.5.87" />
<PackageVersion Include="Uno.UI" Version="5.6.70" />
<PackageVersion Include="Uno.UI.Adapter.Microsoft.Extensions.Logging" Version="5.6.70" />
<PackageVersion Include="Uno.UI.RemoteControl" Version="5.6.70" />
<PackageVersion Include="Uno.UI.Skia.Gtk" Version="5.6.70" />
<PackageVersion Include="Uno.UI.Skia.Wpf" Version="5.6.70" />
<PackageVersion Include="Uno.UI.WebAssembly" Version="5.6.70" />
<PackageVersion Include="Uno.UniversalImageLoader" Version="1.9.36" />
<PackageVersion Include="Uno.Wasm.Bootstrap" Version="8.0.0-dev.306" />
<PackageVersion Include="Uno.Wasm.Bootstrap.DevServer" Version="8.0.0-dev.306" />
<PackageVersion Include="Uno.WinUI" Version="5.5.87" />
<PackageVersion Include="Uno.WinUI.RemoteControl" Version="5.5.87" />
<PackageVersion Include="Uno.WinUI.Skia.Gtk" Version="5.5.87" />
<PackageVersion Include="Uno.WinUI.WebAssembly" Version="5.5.87" />
<PackageVersion Include="Uno.WinUI" Version="5.6.70" />
<PackageVersion Include="Uno.WinUI.RemoteControl" Version="5.6.70" />
<PackageVersion Include="Uno.WinUI.Skia.Gtk" Version="5.6.70" />
<PackageVersion Include="Uno.WinUI.WebAssembly" Version="5.6.70" />
<PackageVersion Include="Xamarin.Android.Support.CustomTabs" Version="28.0.0.3" />
<!-- Required to avoid warnings in 1.9.0.1 of Android.Material - /~https://github.com/xamarin/AndroidX/issues/727 -->
<PackageVersion Include="Xamarin.AndroidX.Annotation" Version="1.7.1.1" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,12 @@ private void OnUnloaded(object sender, RoutedEventArgs e)
partial void OnOwnerChanged()
{
// TODO: Find a proper way to decide whether a NavigationBar exists on canvas (within Page), or is mapped to the UINavigationController's NavigationBar.

_mainCommandClickHandler.Disposable = null;

if (GetNavBar() is { } navBar)
{
navBar.MainCommand.Click += OnMainCommandClick;

_mainCommandClickHandler.Disposable = Disposable.Create(() => navBar.MainCommand.Click -= OnMainCommandClick);

LayoutNativeNavBar(navBar);
Expand All @@ -75,6 +74,21 @@ partial void OnOwnerChanged()

private void LayoutNativeNavBar(NavigationBar navBar)
{
var page = navBar.FindFirstParent<Page>();
var parent = page?.Parent as Page;
if (page is not null
&& parent?.GetType() == page.GetType())
{
// Support for Hot Reload
// On iOS, the current Page instance is retained and its Content is replaced with a new instance of the Page
// If we detect that we have fallen into this scenario, hook up the new NavigationBar from within the new Page instance
// to the native UINavigationBar and UINavigationItem instances.
var vc = parent.FindViewController();

NavigationBarHelper.SetNavigationItem(navBar, vc.NavigationItem);
NavigationBarHelper.SetNavigationBar(navBar, vc.NavigationController?.NavigationBar);
}

if (navBar.TryGetNative<NavigationBar, NavigationBarRenderer, UINavigationBar>(out var nativeBar)
&& nativeBar is { })
{
Expand Down
7 changes: 7 additions & 0 deletions src/Uno.Toolkit.UI/Controls/NavigationBar/Renderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,13 @@ public Renderer(TElement element)
throw new ArgumentNullException(nameof(element));
}

#if __IOS__
if (element is FrameworkElement fe)
{
fe.Unloaded += (s, e) => Dispose();
}
#endif

_element = new WeakReference<TElement>(element);
}

Expand Down
Loading