diff --git a/src/Controls/src/Core/Compatibility/Handlers/TabbedPage/iOS/TabbedRenderer.cs b/src/Controls/src/Core/Compatibility/Handlers/TabbedPage/iOS/TabbedRenderer.cs index 78a0b58b383a..40e1f5b92799 100644 --- a/src/Controls/src/Core/Compatibility/Handlers/TabbedPage/iOS/TabbedRenderer.cs +++ b/src/Controls/src/Core/Compatibility/Handlers/TabbedPage/iOS/TabbedRenderer.cs @@ -43,6 +43,10 @@ public TabbedRenderer() { this.DisableiOS18ToolbarTabs(); _viewHandlerWrapper = new ViewHandlerDelegator(Mapper, CommandMapper, this); + if (MoreNavigationController is not null) + { + MoreNavigationController.Delegate = new MoreTabDelegate(this); + } } public override UIViewController SelectedViewController @@ -60,6 +64,28 @@ public override UIViewController SelectedViewController } } + internal void UpdateCurrentPageForMoreTab() + { + bool isInMoreTab = false; + // Check if the selected tab is in the More tab + if (MoreNavigationController is not null && MoreNavigationController.ViewControllers is not null) + { + foreach (var viewController in MoreNavigationController.ViewControllers) + { + if (viewController == SelectedViewController) + { + isInMoreTab = true; + break; + } + } + } + + if (isInMoreTab) + { + UpdateCurrentPage(); + } + } + protected TabbedPage Tabbed { get { return (TabbedPage)Element; } @@ -190,7 +216,7 @@ void OnPagePropertyChanged(object sender, PropertyChangedEventArgs e) UpdateTabBarItem(page); } } - + public override void TraitCollectionDidChange(UITraitCollection previousTraitCollection) { if (previousTraitCollection.VerticalSizeClass == TraitCollection.VerticalSizeClass) @@ -522,6 +548,11 @@ void UpdateChildrenOrderIndex(UIViewController[] viewControllers) void UpdateCurrentPage() { + if (SelectedViewController?.Title?.Equals("More", StringComparison.Ordinal) == true) + { + Tabbed.CurrentPage = null; + return; + } if (Tabbed is TabbedPage tabbed) { var count = tabbed.InternalChildren.Count; @@ -669,4 +700,24 @@ void IElementHandler.DisconnectHandler() } #endregion } + + class MoreTabDelegate : UINavigationControllerDelegate + { + readonly WeakReference _renderer; + + public MoreTabDelegate(TabbedRenderer renderer) + { + _renderer = new WeakReference(renderer); + } + + public override void DidShowViewController(UINavigationController navigationController, UIViewController viewController, bool animated) + { + if (_renderer is not null + && _renderer.TryGetTarget(out var renderer) + && !renderer.SelectedViewController?.Title?.Equals("More", StringComparison.Ordinal) == true) + { + renderer.UpdateCurrentPageForMoreTab(); + } + } + } } diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue16175.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue16175.cs new file mode 100644 index 000000000000..8d91f4eff5e7 --- /dev/null +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue16175.cs @@ -0,0 +1,39 @@ +namespace Maui.Controls.Sample.Issues; + +[Issue(IssueTracker.Github, 16175, "OnNavigatedTo event triggered in More tabs", PlatformAffected.iOS)] + +public class Issue16175 : TabbedPage +{ + public Issue16175() + { + for (var i = 0; i < 10; i++) + { + var page = new Issue16175Page { Title = $"Tab{i + 1}" }; + Children.Add(page); + } + } +} + +public class Issue16175Page : ContentPage +{ + Label _navigatedToLabel; + + public Issue16175Page() + { + _navigatedToLabel = new Label { Text = "NavigatedTo: Not triggered", AutomationId = "navigatedToLabel" }; + + Content = new VerticalStackLayout + { + Children = { _navigatedToLabel } + }; + } + + protected override void OnNavigatedTo(NavigatedToEventArgs args) + { + if (Title is not null && Title == "Tab8" && _navigatedToLabel is not null) + { + _navigatedToLabel.Text = "NavigatedTo: Triggered"; + } + base.OnNavigatedTo(args); + } +} \ No newline at end of file diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue16175.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue16175.cs new file mode 100644 index 000000000000..7c617f23e7e3 --- /dev/null +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue16175.cs @@ -0,0 +1,25 @@ +#if TEST_FAILS_ON_WINDOWS && TEST_FAILS_ON_ANDROID // More tab is available in Mac and iOS +using NUnit.Framework; +using UITest.Appium; +using UITest.Core; + +namespace Microsoft.Maui.TestCases.Tests.Issues; + +public class Issue16175 : _IssuesUITest +{ + public Issue16175(TestDevice device) : base(device) + { + } + public override string Issue => "OnNavigatedTo event triggered in More tabs"; + + [Test] + [Category(UITestCategories.TabbedPage)] + public void TabEventsTriggeredInMoreTab() + { + App.TapTab("More"); + App.TapTab("Tab8"); + var navigatedToLabel = App.WaitForElement("navigatedToLabel"); + Assert.That(navigatedToLabel.GetText(), Is.EqualTo("NavigatedTo: Triggered")); + } +} +#endif \ No newline at end of file