From ae93381d238ac84289549dd7487abf6058d6a338 Mon Sep 17 00:00:00 2001 From: Alberto Aldegheri Date: Wed, 22 May 2024 13:28:30 +0200 Subject: [PATCH] Fix navigation stuck when pushing on hidden tab section in TabBar --- .../Shell/iOS/ShellSectionRenderer.cs | 14 +++++--- .../TestCases.HostApp/Issues/Issue22570.xaml | 22 ++++++++++++ .../Issues/Issue22570.xaml.cs | 36 +++++++++++++++++++ .../Tests/Issues/Issue22570.cs | 24 +++++++++++++ 4 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 src/Controls/tests/TestCases.HostApp/Issues/Issue22570.xaml create mode 100644 src/Controls/tests/TestCases.HostApp/Issues/Issue22570.xaml.cs create mode 100644 src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue22570.cs diff --git a/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRenderer.cs b/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRenderer.cs index 9321069b3b89..aaeb1dec6d18 100644 --- a/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRenderer.cs +++ b/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRenderer.cs @@ -621,15 +621,21 @@ void PushPage(Page page, bool animated, TaskCompletionSource completionSou var renderer = (IPlatformViewHandler)page.ToHandler(_shellSection.FindMauiContext()); var tracker = _context.CreatePageRendererTracker(); - tracker.ViewController = renderer.ViewController; + var pageViewController = renderer.ViewController!; + tracker.ViewController = pageViewController; tracker.Page = page; _trackers[page] = tracker; - if (completionSource != null) - _completionTasks[renderer.ViewController] = completionSource; + var parentTabBar = ParentViewController as UITabBarController; + var showsPresentation = parentTabBar == null || ReferenceEquals(parentTabBar.SelectedViewController, this); + if (completionSource != null && showsPresentation) + _completionTasks[pageViewController] = completionSource; - PushViewController(renderer.ViewController, animated); + PushViewController(pageViewController, animated); + + if (completionSource != null && !showsPresentation) + completionSource.TrySetResult(true); } async void SendPoppedOnCompletion(Task popTask) diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue22570.xaml b/src/Controls/tests/TestCases.HostApp/Issues/Issue22570.xaml new file mode 100644 index 000000000000..a40476757211 --- /dev/null +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue22570.xaml @@ -0,0 +1,22 @@ + + + + + + +