Skip to content

[iOS, Mac] Fix Shell back button history menu does not update after runtime change - #35542

Merged
kubaflo merged 4 commits into
dotnet:inflight/currentfrom
HarishwaranVijayakumar:fix-35471
Jun 13, 2026
Merged

[iOS, Mac] Fix Shell back button history menu does not update after runtime change#35542
kubaflo merged 4 commits into
dotnet:inflight/currentfrom
HarishwaranVijayakumar:fix-35471

Conversation

@HarishwaranVijayakumar

Copy link
Copy Markdown
Contributor

Note

Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!

Issue Details

  • iOS Shell back button doesn't update its title when a back-stack page's Title changes at runtime (e.g., after locale/culture change). Shows stale text.

Root Cause of the issue

  • UpdateTitle() in ShellPageRendererTracker.cs is guarded by ToolbarReady() which returns false for non-visible pages → early return → UINavigationItem.Title never updated for back-stack pages.

Description of Change

Bug Fix: Shell Navigation Title Updates

  • Updated the UpdateTitle method in ShellPageRendererTracker.cs to set the navigation item title to the current page's title if the toolbar is not ready, ensuring that back button/history menus show the correct title after runtime changes.

Test Coverage

  • Added a new UI test case Issue35471 to verify that the back button history updates when the previous page's title changes at runtime, specifically simulating a culture change.
  • Added a sample issue page (Issue35471) to manually reproduce and test the scenario where the previous page's title is updated and the change should be reflected in the navigation UI.

Issues Fixed

Fixes #35471

Tested the behaviour in the following platforms

  • - Windows
  • - Android
  • - iOS
  • - Mac

Output

Before After
35471-beforefixmac.mov
35471-afterfixmac.mov

@github-actions

github-actions Bot commented May 20, 2026

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 35542

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 35542"

@dotnet-policy-service dotnet-policy-service Bot added the community ✨ Community Contribution label May 20, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Hey there @@HarishwaranVijayakumar! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed.

@dotnet-policy-service dotnet-policy-service Bot added the partner/syncfusion Issues / PR's with Syncfusion collaboration label May 20, 2026
@github-actions github-actions Bot added the area-controls-shell Shell Navigation, Routes, Tabs, Flyout label May 20, 2026
@kubaflo

kubaflo commented May 20, 2026

Copy link
Copy Markdown
Contributor

/review -b feature/regression-check -p ios

@MauiBot MauiBot added s/agent-review-incomplete s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) labels May 20, 2026
@dotnet dotnet deleted a comment from MauiBot May 20, 2026
@kubaflo

kubaflo commented May 20, 2026

Copy link
Copy Markdown
Contributor

/review -b feature/regression-check -p ios

@kubaflo

kubaflo commented May 21, 2026

Copy link
Copy Markdown
Contributor

/review -b feature/regression-check -p ios

@dotnet dotnet deleted a comment from MauiBot May 21, 2026
MauiBot

This comment was marked as outdated.

@sheiksyedm
sheiksyedm marked this pull request as ready for review May 21, 2026 12:03
@kubaflo

kubaflo commented May 22, 2026

Copy link
Copy Markdown
Contributor

/review -b feature/refactor-copilot-yml

@MauiBot MauiBot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Expert Review — 2 findings

See inline comments for details.

{
NavigationItem.Title = _context.Shell.Toolbar.Title;
}
else if (Page?.IsSet(Page.TitleProperty) == true)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[major] Navigation & Shell — This only updates back-stack UINavigationItem.Title when Page.TitleProperty is locally set, so clearing the title leaves the previous native title stale. Concrete scenario: a page title is changed from "Home" to cleared/default while the page is on the Shell back stack; OnPagePropertyChanged calls UpdateTitle(), but this branch is skipped and iOS continues to show the old back-button/history title. Please mirror the effective-title semantics used by ShellToolbar.UpdateTitle() for the non-current page, including assigning an empty string/null when the page title is cleared.


// Verify back button now shows updated title "Accueil"
// Without the fix, UINavigationItem.Title is stale and still shows "Home"
App.WaitForElement("Accueil");

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[moderate] Regression Prevention and Test Coverage — The regression test only waits for/taps the visible back button text "Accueil"; it does not exercise the history-menu path named by the issue, and it remains dependent on native accessibility exposing the back-button title. Since the supplied gate already failed unexpectedly and the test has to skip iOS 26 for this exact accessibility reason, this is likely too brittle as the sole regression. Please either validate the native history-menu/back-stack title through a deterministic device-test hook, or make the UI test explicitly cover only the supported visible-back-button scenario and add a lower-level assertion for UINavigationItem.Title.

@MauiBot MauiBot added the s/agent-fix-win AI found a better alternative fix than the PR label May 23, 2026
@dotnet dotnet deleted a comment from MauiBot May 23, 2026
@kubaflo

kubaflo commented May 23, 2026

Copy link
Copy Markdown
Contributor

/review -b feature/refactor-copilot-yml

@MauiBot MauiBot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Expert Review — 2 findings

See inline comments for details.

{
NavigationItem.Title = _context.Shell.Toolbar.Title;
}
else if (Page?.IsSet(Page.TitleProperty) == true)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[major] Logic and Correctness — This skips updating a back-stack page when TitleProperty is cleared/defaulted. OnPagePropertyChanged still calls UpdateTitle() for hidden pages, but once ToolbarReady() is false this branch only assigns NavigationItem.Title when Page.TitleProperty is locally set. A previous page that had Title = "Home" and later calls ClearValue(Page.TitleProperty) during a localization/default-title refresh leaves the native UINavigationItem.Title as "Home", so the iOS back button/history menu remains stale. Update the native title for every back-stack TitleProperty change, including clearing to null/empty, rather than gating on IsSet.


// Verify back button now shows updated title "Accueil"
// Without the fix, UINavigationItem.Title is stale and still shows "Home"
App.WaitForElement("Accueil");

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[moderate] Regression Prevention — This asserts the visible back button text on a two-page stack, but the reported regression is the iOS long-press back-history menu. With only Home -> Detail, the test can pass without ever opening or validating the history menu path. Please make the repro stack deep enough to show a back-history menu and use the existing long-press pattern (App.LongPress("Back")) to assert/select the updated history item.

@kubaflo

kubaflo commented May 24, 2026

Copy link
Copy Markdown
Contributor

/review -b feature/refactor-copilot-yml

@MauiBot MauiBot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Expert Review — 2 findings

See inline comments for details.

{
NavigationItem.Title = _context.Shell.Toolbar.Title;
}
else if (Page?.IsSet(Page.TitleProperty) == true)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[major] Logic and Correctness — This only updates hidden-page NavigationItem.Title while Page.TitleProperty is locally set. If a page previously had a local title and that value is later cleared with ClearValue(Page.TitleProperty) while the page is on the back stack, IsSet becomes false and this method leaves the old native title in place, so the iOS back button/history menu can still show stale text. Please clear/update NavigationItem.Title for the hidden-page TitleProperty change even when the property is no longer locally set, or otherwise track and reset titles that this code previously wrote.

{
// iOS 26+ no longer exposes the back button title text via accessibility,
// so there is no reliable way to assert the updated title in a UI test.
if (App is AppiumIOSApp iosApp && HelperExtensions.IsIOS26OrHigher(iosApp))

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[major] Regression Prevention — The issue was reported on iOS 26 and specifically affects the long-press back-history menu, but this test skips iOS 26 entirely and only asserts the visible two-page back button text via accessibility. That can pass while the reported history menu remains stale on the affected OS. Please add coverage that exercises the reported scenario on iOS 26, e.g. a lower-level/handler test that inspects the UINavigationItem/back item title used by the history menu, or an automation path that opens the long-press menu instead of skipping the affected platform.

@MauiBot MauiBot removed the s/agent-review-in-progress AI review is currently running for this PR label Jun 11, 2026

@kubaflo kubaflo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please check the ai's suggestions?

@HarishwaranVijayakumar

Copy link
Copy Markdown
Contributor Author

Could you please check the ai's suggestions?

As per the AI suggestion, I have modified the fix.

@kubaflo

kubaflo commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

/review -b feature/enhanced-reviewer -p ios

@github-actions github-actions Bot added the s/agent-review-in-progress AI review is currently running for this PR label Jun 12, 2026
MauiBot

This comment was marked as outdated.

@MauiBot MauiBot removed the s/agent-review-in-progress AI review is currently running for this PR label Jun 12, 2026

@kubaflo kubaflo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please check the ai's suggestions?

@kubaflo

kubaflo commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

/review -b feature/enhanced-reviewer -p ios

@github-actions github-actions Bot added the s/agent-review-in-progress AI review is currently running for this PR label Jun 13, 2026

@MauiBot MauiBot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI Review Summary

@HarishwaranVijayakumar — new AI review results are available based on this last commit: 0e97b65. To request a fresh review after new comments or commits, comment /review rerun.

Gate Failed Code Review In Review Confidence Low Platform iOS

Review Sessions — click to expand
Gate — Test Before & After Fix

Gate Result: ❌ FAILED

Platform: IOS · Base: main · Merge base: bb4e7040

🩺 Test does not reproduce the bug — ran the same in both states (PASS without fix, PASS with fix). The repro test is not exercising the issue. Strengthen the test before reviewing the fix.

Test Without Fix (expect FAIL) With Fix (expect PASS)
🖥️ Issue35471 Issue35471 ❌ PASS — 332s ✅ PASS — 123s
🔴 Without fix — 🖥️ Issue35471: PASS ❌ · 332s
  Determining projects to restore...
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 652 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 1.42 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 4.81 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/Foldable/src/Controls.Foldable.csproj (in 6.86 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Core/maps/src/Maps.csproj (in 6.89 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/Maps/src/Controls.Maps.csproj (in 6.88 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Xaml/Controls.Xaml.csproj (in 6.89 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj (in 6.89 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/BlazorWebView/src/Maui/Microsoft.AspNetCore.Components.WebView.Maui.csproj (in 6.92 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 5.49 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 6.92 sec).
/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0-ios26.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0-ios26.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0-ios26.0/Microsoft.Maui.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Maps.dll
  Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Maps.dll
  Microsoft.AspNetCore.Components.WebView.Maui -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-ios26.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Controls.Foldable -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Foldable.dll
  Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Xaml.dll
  Detected signing identity:
    Code Signing Key: "" (-)
    Provisioning Profile: "" () - no entitlements
    Bundle Id: com.microsoft.maui.uitests
    App Id: com.microsoft.maui.uitests
  Controls.TestCases.HostApp -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-ios/iossimulator-arm64/Controls.TestCases.HostApp.dll
  Optimizing assemblies for size may change the behavior of the app. Be sure to test after publishing. See: https://aka.ms/dotnet-illink
  Optimizing assemblies for size. This process might take a while.

Build succeeded.

/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
    1 Warning(s)
    0 Error(s)

Time Elapsed 00:03:05.25
  Determining projects to restore...
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/CustomAttributes/Controls.CustomAttributes.csproj (in 753 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/VisualTestUtils/VisualTestUtils.csproj (in 753 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 754 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 753 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 753 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.Core/UITest.Core.csproj (in 1 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 815 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 135 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.NUnit/UITest.NUnit.csproj (in 1.07 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.Appium/UITest.Appium.csproj (in 2.42 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.Analyzers/UITest.Analyzers.csproj (in 3.02 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/VisualTestUtils.MagickNet/VisualTestUtils.MagickNet.csproj (in 6.88 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.iOS.Tests/Controls.TestCases.iOS.Tests.csproj (in 6.91 sec).
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Controls.CustomAttributes -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
  Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  VisualTestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
  UITest.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
  VisualTestUtils.MagickNet -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
  UITest.NUnit -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
  UITest.Appium -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
  UITest.Analyzers -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
  Controls.TestCases.iOS.Tests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.07]   Discovering: Controls.TestCases.iOS.Tests
[xUnit.net 00:00:00.21]   Discovered:  Controls.TestCases.iOS.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
   NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 6/13/2026 8:43:29 AM FixtureSetup for Issue35471(iOS)
>>>>> 6/13/2026 8:43:34 AM ShellBackButtonHistoryUpdatesAfterTitleChange Start
>>>>> 6/13/2026 8:43:34 AM ShellBackButtonHistoryUpdatesAfterTitleChange Stop
ShellBackButtonHistoryUpdatesAfterTitleChange: iOS 26+ does not expose back button title text via accessibility
  Skipped ShellBackButtonHistoryUpdatesAfterTitleChange [69 ms]
NUnit Adapter 4.5.0.0: Test execution complete
Results File: /Users/cloudtest/vss/_work/1/s/CustomAgentLogsTmp/UITests/TestResults/Issue35471.trx

Test Run Successful.
Total tests: 1
    Skipped: 1
 Total time: 1.4952 Minutes
>>> TRX_RESULT_FILE: /Users/cloudtest/vss/_work/1/s/CustomAgentLogsTmp/UITests/TestResults/Issue35471.trx

🟢 With fix — 🖥️ Issue35471: PASS ✅ · 123s
  Determining projects to restore...
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 422 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 445 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 449 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 501 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 519 ms).
  6 of 11 projects are up-to-date for restore.
/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0-ios26.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0-ios26.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0-ios26.0/Microsoft.Maui.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Maps.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Maps.dll
  Controls.Foldable -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Foldable.dll
  Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Xaml.dll
  Microsoft.AspNetCore.Components.WebView.Maui -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-ios26.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
  Detected signing identity:
    Code Signing Key: "" (-)
    Provisioning Profile: "" () - no entitlements
    Bundle Id: com.microsoft.maui.uitests
    App Id: com.microsoft.maui.uitests
  Controls.TestCases.HostApp -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-ios/iossimulator-arm64/Controls.TestCases.HostApp.dll
  Optimizing assemblies for size may change the behavior of the app. Be sure to test after publishing. See: https://aka.ms/dotnet-illink
  Optimizing assemblies for size. This process might take a while.

Build succeeded.

/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
    1 Warning(s)
    0 Error(s)

Time Elapsed 00:01:04.29
  Determining projects to restore...
  Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 380 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 430 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 380 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 462 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 486 ms).
  8 of 13 projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Controls.CustomAttributes -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
  Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14370768
  Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  VisualTestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
  VisualTestUtils.MagickNet -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
  UITest.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
  UITest.NUnit -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
  UITest.Appium -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
  UITest.Analyzers -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
  Controls.TestCases.iOS.Tests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.06]   Discovering: Controls.TestCases.iOS.Tests
[xUnit.net 00:00:00.21]   Discovered:  Controls.TestCases.iOS.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
   NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 6/13/2026 8:45:33 AM FixtureSetup for Issue35471(iOS)
>>>>> 6/13/2026 8:45:38 AM ShellBackButtonHistoryUpdatesAfterTitleChange Start
>>>>> 6/13/2026 8:45:38 AM ShellBackButtonHistoryUpdatesAfterTitleChange Stop
ShellBackButtonHistoryUpdatesAfterTitleChange: iOS 26+ does not expose back button title text via accessibility
  Skipped ShellBackButtonHistoryUpdatesAfterTitleChange [62 ms]
NUnit Adapter 4.5.0.0: Test execution complete
Results File: /Users/cloudtest/vss/_work/1/s/CustomAgentLogsTmp/UITests/TestResults/Issue35471.trx

Test Run Successful.
Total tests: 1
    Skipped: 1
 Total time: 24.6729 Seconds
>>> TRX_RESULT_FILE: /Users/cloudtest/vss/_work/1/s/CustomAgentLogsTmp/UITests/TestResults/Issue35471.trx

⚠️ Failure Details

  • Issue35471 PASSED without fix (should fail) — tests don't catch the bug
📁 Fix files reverted (2 files)
  • eng/pipelines/ci-copilot.yml
  • src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellPageRendererTracker.cs

UI Tests

Full UI test matrix will run (no specific categories detected from PR changes).


Pre-Flight — Context & Validation

Issue: #35471 - iOS Shell back button history menu does not update after runtime culture change
PR: #35542 - Fix Shell iOS back button/history menu title updates
Platforms Affected: iOS, MacCatalyst
Files Changed: 13 implementation/infrastructure, 2 test

Key Findings

  • GitHub CLI is unauthenticated in this environment, so PR/issue body, comments, inline reviews, and required checks could not be fetched live; local branch pr-review-35542 was used as the PR source.
  • The focused Shell fix changes ShellPageRendererTracker.UpdateTitle() so non-visible/back-stack pages assign NavigationItem.Title = Page?.Title instead of returning when the Shell toolbar is not ready.
  • Added UI coverage is iOS/MacCatalyst-only and Shell-category, but it skips iOS 26+ and validates visible back-button text rather than the long-press back-history menu reported in #35471.
  • Local diff also includes Copilot CI/reviewer telemetry changes unrelated to the iOS Shell title fix.

Code Review Summary

Verdict: NEEDS_CHANGES
Confidence: low
Errors: 2 | Warnings: 2 | Suggestions: 0

Key code review findings:

  • src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35471.cs:24 skips iOS 26+, the affected platform from the issue report.
  • src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35471.cs:39 validates visible back-button text, not the long-press back-history menu behavior.
  • ⚠️ .github/scripts/shared/Aggregate-CopilotTokenUsage.ps1:166 recursively trusts broad downloaded artifact trees for token telemetry aggregation.
  • ⚠️ .github/scripts/Review-PR.ps1:760 can throw when compact context telemetry has no suffix.

Fix Candidates

# Source Approach Test Result Files Changed Notes
PR PR #35542 In ShellPageRendererTracker.UpdateTitle(), use Shell toolbar title for the current toolbar page and assign Page?.Title to UINavigationItem.Title for non-toolbar/back-stack pages. ❌ Gate failed before this run ShellPageRendererTracker.cs, Issue35471 UI test files Original PR; code direction is plausible but test coverage is insufficient.

Code Review — Deep Analysis

Code Review — PR #35542

Independent Assessment

What this changes: Updates iOS Shell title propagation for back-stack pages, adds an Issue35471 UI repro/test, and local checkout also contains unrelated Copilot CI/token-usage pipeline changes.
Inferred motivation: Fix stale iOS Shell back-button/history-menu titles after runtime title/culture changes; improve reviewer telemetry.

Reconciliation with PR Narrative

Author claims: Fixes #35471 by updating UINavigationItem.Title for non-visible Shell pages and adds UI coverage.
Agreement/disagreement: The code matches the title-update claim, but the test does not cover the reported iOS 26 long-press history-menu scenario. The local checkout includes many CI changes not described by the PR narrative.

Prior Review Reconciliation

Prior ❌ Error Finding Source Status Evidence
Test skips iOS 26+, the affected platform, leaving no automated regression for the reported behavior MauiBot inline Issue35471.cs:24 ❌ Unresolved Current test still calls Assert.Ignore on iOS 26+ at src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35471.cs:24.
Test validates visible two-page back button text, not long-press history menu MauiBot inline Issue35471.cs:39 ❌ Unresolved Current test only WaitForElement("Accueil") and taps it; no long-press/history-menu path.
Clearing TitleProperty leaves stale native title MauiBot inline ShellPageRendererTracker.cs:213 ✅ Fixed Current UpdateTitle() assigns NavigationItem.Title = Page?.Title without an IsSet gate at line 216.

Blast Radius Assessment

  • Runs for all instances: Yes — UpdateTitle() is shared Shell iOS/MacCatalyst navigation plumbing.
  • Startup impact: Low; invoked during page setup/title changes, not static startup.
  • Static/shared state: No.

CI Status

  • Required-check result: gh pr checks --required unavailable because GitHub CLI is unauthenticated.
  • API fallback: maui-pr failed; license/cla passed.
  • Classification: red CI, likely infra/flaky from Build Analysis (Microsoft.Maui.Core.After.targets missing; Dispatcher Helix failures with known failure-rate links), but not clean.
  • Action taken: invoked azdo-build-investigator context; confidence capped low; no LGTM.

Findings

❌ Error — Regression test skips the reported affected platform

src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35471.cs:24

Issue #35471 reports iOS 26 and specifically the long-press back-button history menu. The only added regression test skips iOS 26+, so it cannot fail on the platform where the bug was reported. This leaves the fix unverified by automation for the target scenario.

❌ Error — Test does not exercise the history-menu behavior

src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35471.cs:39

The test uses a two-page stack and taps visible back-button text "Accueil". The issue is stale text in the iOS long-press back-button history menu. A visible back-button assertion can pass while the history menu remains stale.

⚠️ Warning — Token usage aggregation trusts broad artifact tree

.github/scripts/shared/Aggregate-CopilotTokenUsage.ps1:166

Read-CopilotTokenUsageRecords recursively accepts every copilot-token-usage-*.json under downloaded CopilotLogs, which also contains copied CustomAgentLogsTmp. This can allow PR-controlled artifacts to poison telemetry summaries dispatched later. Restrict to CopilotLogs/copilot-token-usage/raw and validate schema/source paths.

⚠️ Warning — Unsuffixed compact context values throw

.github/scripts/Review-PR.ps1:760

Convert-CopilotCompactNumber allows no suffix, but calls $Matches['suffix'].ToUpperInvariant(). A footer like GPT-5.5 • 200000 context throws, dropping context-window telemetry. Coalesce suffix before switching.

Failure-Mode Probing

  • iOS 26 reported path: skipped, so no regression signal.
  • Back-stack title cleared: current implementation assigns Page?.Title, so stale title should clear.
  • Hidden page title update: OnPagePropertyChanged calls UpdateTitle(), and non-toolbar path updates NavigationItem.Title.
  • Token artifact poisoning: broad recursive scan can include matching files outside trusted telemetry raw folder.

Verdict: NEEDS_CHANGES

Confidence: low — platform Shell change plus red/undetermined CI.
Summary: The code fix direction is plausible, but prior critical test-coverage findings remain unresolved. The regression test must cover the affected iOS 26/history-menu scenario or add a deterministic lower-level assertion before merge.


Fix — Analysis & Comparison

Fix Candidates

# Source Approach Test Result Files Changed Notes
1 try-fix Update back-stack NavigationItem.Title only from OnPagePropertyChanged when Page.TitleProperty changes and the page is not toolbar-ready. ❌ Failed 1 file Build/test command ran, but Issue35471 was skipped on iOS 26+, so no regression validation; narrower than PR fix.
2 try-fix Track predecessor page in ShellSectionRenderer and update predecessor BackBarButtonItem.Title through the displayed page tracker. ❌ Failed 2 files Builds, but Issue35471 was skipped on iOS 26+; uncertain whether history menu uses BackBarButtonItem or NavigationItem title.
3 try-fix Let ShellSectionRenderer own back-stack NavigationItem.Title synchronization for tracked non-top stack pages. ❌ Failed 1 file Builds, but Issue35471 was skipped on iOS 26+; plausible but more invasive than PR fix and needs native-state device coverage.
PR PR #35542 Generalize UpdateTitle() so current pages use Shell toolbar title and back-stack pages use Page?.Title. ❌ Gate failed 3 focused files Original PR; simplest product-code approach among explored options, but current test coverage is insufficient.

Cross-Pollination

Model Round New Ideas? Details
maui-expert-reviewer 1 Yes Suggested moving back-stack synchronization to Shell navigation-stack ownership; candidate 1 implemented a safer tracker-local subset after root-renderer risk review.
maui-expert-reviewer 2 Yes Suggested updating predecessor BackBarButtonItem.Title from ShellSectionRenderer; candidate 2 implemented this.
maui-expert-reviewer 3 Yes Suggested ShellSection-level NavigationItem.Title synchronization for non-top stack pages; candidate 3 implemented this.
maui-expert-reviewer 4 No No further product-level options beyond per-page tracker sync, explicit back item sync, and stack-wide NavigationItem.Title sync; remaining ideas would be lifecycle/event-placement variations.

Candidate Narratives

try-fix-1

Handle Page.TitleProperty changes directly in ShellPageRendererTracker.OnPagePropertyChanged: current/toolbar-ready pages keep the original UpdateTitle() path; non-toolbar pages set NavigationItem.Title = Page?.Title. This failed as a candidate because the focused iOS test skipped on iOS 26+ and the approach may miss initial synchronization/non-property-change callers.

try-fix-2

Keep UpdateTitle() current-toolbar-only and update the predecessor BackBarButtonItem.Title through the displayed page tracker from a ShellSectionRenderer predecessor-page subscription. This built after a nullable fix, but failed as a candidate because the focused iOS test skipped and the native source for the long-press history menu may be NavigationItem.Title, not BackBarButtonItem.Title.

try-fix-3

Keep UpdateTitle() unchanged and let ShellSectionRenderer track stack pages, subscribe to Page.TitleProperty, and update non-top controllers' NavigationItem.Title. This built, but failed as a candidate because the focused iOS test skipped; it is more invasive than the PR fix and needs direct native-state device coverage before selection.

Exhausted: Yes
Selected Fix: None of the alternatives — no candidate passed meaningful regression validation or was demonstrably better than PR #35542. The PR's product-code fix remains the simplest explored approach, but the test strategy needs improvement because the available iOS 26+ run skips the only Issue35471 assertion.


Report — Final Recommendation

Comparative Report — PR #35542

Candidate ranking

Rank Candidate Regression result Assessment
1 pr-plus-reviewer ❌ Gate failed / insufficient Issue35471 validation Best overall candidate. It keeps the raw PR's localized and plausible NavigationItem.Title synchronization for back-stack pages and also fixes the expert reviewer's actionable telemetry parser warning.
2 pr ❌ Gate failed / insufficient Issue35471 validation Best Shell product-code approach among the original candidates: focused, low-invasiveness, and directly updates the native title state likely used by iOS back-history UI. Ranked below pr-plus-reviewer because it leaves the reviewer warning unresolved.
3 try-fix-1 ❌ Failed / skipped on iOS 26+ Narrower than the PR fix because it updates back-stack title state only from direct Page.TitleProperty changes. It may miss initial synchronization and other UpdateTitle() callers.
4 try-fix-3 ❌ Failed / skipped on iOS 26+ Plausible but more invasive. It adds ShellSection-level tracking/subscriptions and a second synchronization path for back-stack page titles, increasing lifecycle risk without stronger validation.
5 try-fix-2 ❌ Failed / skipped on iOS 26+ Riskiest functional uncertainty. It updates BackBarButtonItem.Title, but the reported long-press history menu may use each controller's NavigationItem.Title instead.

Comparison details

pr

The raw PR changes ShellPageRendererTracker.UpdateTitle() so visible/current pages use the Shell toolbar title and non-toolbar/back-stack pages update NavigationItem.Title from Page?.Title. This is the simplest product-code change and directly targets stale native back-stack title state.

Its major weakness is evidence: the added Issue35471 UI test skips iOS 26+ and checks visible back-button text rather than the long-press back-history menu. The gate failed because the test passed without the fix, so it does not prove the regression.

pr-plus-reviewer

This candidate is the raw PR plus the expert reviewer's actionable warning fix in .github/scripts/Review-PR.ps1. The sandbox patch makes unsuffixed Copilot CLI context values parse as plain numbers and adds a focused test for GPT-5.5 • 200000 context.

This does not change Shell behavior or repair the failed Issue35471 regression coverage. It is still ranked first because no candidate passed meaningful regression validation, and this candidate strictly improves the full PR diff without adding product-code risk.

try-fix-1

This candidate updates NavigationItem.Title from OnPagePropertyChanged only when Page.TitleProperty changes and the page is not toolbar-ready. It is narrower than the PR fix and may miss initial title synchronization paths that call UpdateTitle() outside direct title-change notifications.

try-fix-2

This candidate tracks the predecessor page in ShellSectionRenderer and updates the displayed page tracker's back-button title. It adds lifecycle/subscription complexity and may update the wrong native property for the reported long-press history menu, making it weaker than the NavigationItem.Title approaches.

try-fix-3

This candidate lets ShellSectionRenderer own back-stack NavigationItem.Title synchronization for tracked non-top pages. It is directionally plausible but more invasive than the PR fix because it adds a second title synchronization system and page subscription set.

Winner

Winner: pr-plus-reviewer.

Rationale: no candidate passed regression validation, so the winner is the safest and most complete candidate among failed/insufficiently validated options. pr-plus-reviewer preserves the raw PR's simplest Shell fix and incorporates the expert reviewer's validated telemetry parser correction, while all try-fix alternatives either cover a narrower path or add more lifecycle/native-state risk.


Future Action — review latest findings

No alternative fix was selected for this run. Review the session findings and CI results before merging.

@MauiBot MauiBot removed the s/agent-review-in-progress AI review is currently running for this PR label Jun 13, 2026
@kubaflo
kubaflo changed the base branch from main to inflight/current June 13, 2026 20:21
@kubaflo
kubaflo merged commit 17fe32d into dotnet:inflight/current Jun 13, 2026
27 of 31 checks passed
@github-actions github-actions Bot added this to the .NET 10 SR9 milestone Jun 13, 2026
PureWeen pushed a commit that referenced this pull request Jun 22, 2026
…untime change (#35542)

<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!
<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->
### Issue Details

- iOS Shell back button doesn't update its title when a back-stack
page's Title changes at runtime (e.g., after locale/culture change).
Shows stale text.

### Root Cause of the issue

- UpdateTitle() in ShellPageRendererTracker.cs is guarded by
ToolbarReady() which returns false for non-visible pages → early return
→ UINavigationItem.Title never updated for back-stack pages.

### Description of Change

### Bug Fix: Shell Navigation Title Updates

* Updated the `UpdateTitle` method in `ShellPageRendererTracker.cs` to
set the navigation item title to the current page's title if the toolbar
is not ready, ensuring that back button/history menus show the correct
title after runtime changes.

### Test Coverage

* Added a new UI test case `Issue35471` to verify that the back button
history updates when the previous page's title changes at runtime,
specifically simulating a culture change.
* Added a sample issue page (`Issue35471`) to manually reproduce and
test the scenario where the previous page's title is updated and the
change should be reflected in the navigation UI.

<!-- Enter description of the fix in this section -->

### Issues Fixed

<!-- Please make sure that there is a bug logged for the issue being
fixed. The bug should describe the problem and how to reproduce it. -->

Fixes #35471

### Tested the behaviour in the following platforms

- [ ] - Windows 
- [ ] - Android
- [x] - iOS
- [x] - Mac

### Output

| Before | After |
|----------|----------|
| <video
src="https://github.com/user-attachments/assets/243560ab-b8e4-42c7-9ae7-4a0681812cac">
| <video
src="https://github.com/user-attachments/assets/af1d1343-eb05-414a-9a53-6eb862a5ded2">
|








<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->
kubaflo pushed a commit that referenced this pull request Jun 25, 2026
…untime change (#35542)

<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!
<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->
### Issue Details

- iOS Shell back button doesn't update its title when a back-stack
page's Title changes at runtime (e.g., after locale/culture change).
Shows stale text.

### Root Cause of the issue

- UpdateTitle() in ShellPageRendererTracker.cs is guarded by
ToolbarReady() which returns false for non-visible pages → early return
→ UINavigationItem.Title never updated for back-stack pages.

### Description of Change

### Bug Fix: Shell Navigation Title Updates

* Updated the `UpdateTitle` method in `ShellPageRendererTracker.cs` to
set the navigation item title to the current page's title if the toolbar
is not ready, ensuring that back button/history menus show the correct
title after runtime changes.

### Test Coverage

* Added a new UI test case `Issue35471` to verify that the back button
history updates when the previous page's title changes at runtime,
specifically simulating a culture change.
* Added a sample issue page (`Issue35471`) to manually reproduce and
test the scenario where the previous page's title is updated and the
change should be reflected in the navigation UI.

<!-- Enter description of the fix in this section -->

### Issues Fixed

<!-- Please make sure that there is a bug logged for the issue being
fixed. The bug should describe the problem and how to reproduce it. -->

Fixes #35471

### Tested the behaviour in the following platforms

- [ ] - Windows 
- [ ] - Android
- [x] - iOS
- [x] - Mac

### Output

| Before | After |
|----------|----------|
| <video
src="https://github.com/user-attachments/assets/243560ab-b8e4-42c7-9ae7-4a0681812cac">
| <video
src="https://github.com/user-attachments/assets/af1d1343-eb05-414a-9a53-6eb862a5ded2">
|








<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->
kubaflo pushed a commit that referenced this pull request Jul 3, 2026
…untime change (#35542)

<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!
<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->
### Issue Details

- iOS Shell back button doesn't update its title when a back-stack
page's Title changes at runtime (e.g., after locale/culture change).
Shows stale text.

### Root Cause of the issue

- UpdateTitle() in ShellPageRendererTracker.cs is guarded by
ToolbarReady() which returns false for non-visible pages → early return
→ UINavigationItem.Title never updated for back-stack pages.

### Description of Change

### Bug Fix: Shell Navigation Title Updates

* Updated the `UpdateTitle` method in `ShellPageRendererTracker.cs` to
set the navigation item title to the current page's title if the toolbar
is not ready, ensuring that back button/history menus show the correct
title after runtime changes.

### Test Coverage

* Added a new UI test case `Issue35471` to verify that the back button
history updates when the previous page's title changes at runtime,
specifically simulating a culture change.
* Added a sample issue page (`Issue35471`) to manually reproduce and
test the scenario where the previous page's title is updated and the
change should be reflected in the navigation UI.

<!-- Enter description of the fix in this section -->

### Issues Fixed

<!-- Please make sure that there is a bug logged for the issue being
fixed. The bug should describe the problem and how to reproduce it. -->

Fixes #35471

### Tested the behaviour in the following platforms

- [ ] - Windows 
- [ ] - Android
- [x] - iOS
- [x] - Mac

### Output

| Before | After |
|----------|----------|
| <video
src="https://github.com/user-attachments/assets/243560ab-b8e4-42c7-9ae7-4a0681812cac">
| <video
src="https://github.com/user-attachments/assets/af1d1343-eb05-414a-9a53-6eb862a5ded2">
|








<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->
@kubaflo kubaflo mentioned this pull request Jul 6, 2026
kubaflo pushed a commit that referenced this pull request Jul 6, 2026
…untime change (#35542)

<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!
<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->
### Issue Details

- iOS Shell back button doesn't update its title when a back-stack
page's Title changes at runtime (e.g., after locale/culture change).
Shows stale text.

### Root Cause of the issue

- UpdateTitle() in ShellPageRendererTracker.cs is guarded by
ToolbarReady() which returns false for non-visible pages → early return
→ UINavigationItem.Title never updated for back-stack pages.

### Description of Change

### Bug Fix: Shell Navigation Title Updates

* Updated the `UpdateTitle` method in `ShellPageRendererTracker.cs` to
set the navigation item title to the current page's title if the toolbar
is not ready, ensuring that back button/history menus show the correct
title after runtime changes.

### Test Coverage

* Added a new UI test case `Issue35471` to verify that the back button
history updates when the previous page's title changes at runtime,
specifically simulating a culture change.
* Added a sample issue page (`Issue35471`) to manually reproduce and
test the scenario where the previous page's title is updated and the
change should be reflected in the navigation UI.

<!-- Enter description of the fix in this section -->

### Issues Fixed

<!-- Please make sure that there is a bug logged for the issue being
fixed. The bug should describe the problem and how to reproduce it. -->

Fixes #35471

### Tested the behaviour in the following platforms

- [ ] - Windows 
- [ ] - Android
- [x] - iOS
- [x] - Mac

### Output

| Before | After |
|----------|----------|
| <video
src="https://github.com/user-attachments/assets/243560ab-b8e4-42c7-9ae7-4a0681812cac">
| <video
src="https://github.com/user-attachments/assets/af1d1343-eb05-414a-9a53-6eb862a5ded2">
|








<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->
PureWeen pushed a commit that referenced this pull request Jul 7, 2026
…untime change (#35542)

<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!
<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->
### Issue Details

- iOS Shell back button doesn't update its title when a back-stack
page's Title changes at runtime (e.g., after locale/culture change).
Shows stale text.

### Root Cause of the issue

- UpdateTitle() in ShellPageRendererTracker.cs is guarded by
ToolbarReady() which returns false for non-visible pages → early return
→ UINavigationItem.Title never updated for back-stack pages.

### Description of Change

### Bug Fix: Shell Navigation Title Updates

* Updated the `UpdateTitle` method in `ShellPageRendererTracker.cs` to
set the navigation item title to the current page's title if the toolbar
is not ready, ensuring that back button/history menus show the correct
title after runtime changes.

### Test Coverage

* Added a new UI test case `Issue35471` to verify that the back button
history updates when the previous page's title changes at runtime,
specifically simulating a culture change.
* Added a sample issue page (`Issue35471`) to manually reproduce and
test the scenario where the previous page's title is updated and the
change should be reflected in the navigation UI.

<!-- Enter description of the fix in this section -->

### Issues Fixed

<!-- Please make sure that there is a bug logged for the issue being
fixed. The bug should describe the problem and how to reproduce it. -->

Fixes #35471

### Tested the behaviour in the following platforms

- [ ] - Windows 
- [ ] - Android
- [x] - iOS
- [x] - Mac

### Output

| Before | After |
|----------|----------|
| <video
src="https://github.com/user-attachments/assets/243560ab-b8e4-42c7-9ae7-4a0681812cac">
| <video
src="https://github.com/user-attachments/assets/af1d1343-eb05-414a-9a53-6eb862a5ded2">
|








<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->
PureWeen pushed a commit that referenced this pull request Jul 7, 2026
…untime change (#35542)

<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!
<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->
### Issue Details

- iOS Shell back button doesn't update its title when a back-stack
page's Title changes at runtime (e.g., after locale/culture change).
Shows stale text.

### Root Cause of the issue

- UpdateTitle() in ShellPageRendererTracker.cs is guarded by
ToolbarReady() which returns false for non-visible pages → early return
→ UINavigationItem.Title never updated for back-stack pages.

### Description of Change

### Bug Fix: Shell Navigation Title Updates

* Updated the `UpdateTitle` method in `ShellPageRendererTracker.cs` to
set the navigation item title to the current page's title if the toolbar
is not ready, ensuring that back button/history menus show the correct
title after runtime changes.

### Test Coverage

* Added a new UI test case `Issue35471` to verify that the back button
history updates when the previous page's title changes at runtime,
specifically simulating a culture change.
* Added a sample issue page (`Issue35471`) to manually reproduce and
test the scenario where the previous page's title is updated and the
change should be reflected in the navigation UI.

<!-- Enter description of the fix in this section -->

### Issues Fixed

<!-- Please make sure that there is a bug logged for the issue being
fixed. The bug should describe the problem and how to reproduce it. -->

Fixes #35471

### Tested the behaviour in the following platforms

- [ ] - Windows 
- [ ] - Android
- [x] - iOS
- [x] - Mac

### Output

| Before | After |
|----------|----------|
| <video
src="https://github.com/user-attachments/assets/243560ab-b8e4-42c7-9ae7-4a0681812cac">
| <video
src="https://github.com/user-attachments/assets/af1d1343-eb05-414a-9a53-6eb862a5ded2">
|








<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->
kubaflo pushed a commit that referenced this pull request Jul 10, 2026
…untime change (#35542)

<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!
<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->
### Issue Details

- iOS Shell back button doesn't update its title when a back-stack
page's Title changes at runtime (e.g., after locale/culture change).
Shows stale text.

### Root Cause of the issue

- UpdateTitle() in ShellPageRendererTracker.cs is guarded by
ToolbarReady() which returns false for non-visible pages → early return
→ UINavigationItem.Title never updated for back-stack pages.

### Description of Change

### Bug Fix: Shell Navigation Title Updates

* Updated the `UpdateTitle` method in `ShellPageRendererTracker.cs` to
set the navigation item title to the current page's title if the toolbar
is not ready, ensuring that back button/history menus show the correct
title after runtime changes.

### Test Coverage

* Added a new UI test case `Issue35471` to verify that the back button
history updates when the previous page's title changes at runtime,
specifically simulating a culture change.
* Added a sample issue page (`Issue35471`) to manually reproduce and
test the scenario where the previous page's title is updated and the
change should be reflected in the navigation UI.

<!-- Enter description of the fix in this section -->

### Issues Fixed

<!-- Please make sure that there is a bug logged for the issue being
fixed. The bug should describe the problem and how to reproduce it. -->

Fixes #35471

### Tested the behaviour in the following platforms

- [ ] - Windows 
- [ ] - Android
- [x] - iOS
- [x] - Mac

### Output

| Before | After |
|----------|----------|
| <video
src="https://github.com/user-attachments/assets/243560ab-b8e4-42c7-9ae7-4a0681812cac">
| <video
src="https://github.com/user-attachments/assets/af1d1343-eb05-414a-9a53-6eb862a5ded2">
|








<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->
@github-actions github-actions Bot locked and limited conversation to collaborators Jul 14, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-controls-shell Shell Navigation, Routes, Tabs, Flyout community ✨ Community Contribution partner/syncfusion Issues / PR's with Syncfusion collaboration s/agent-fix-win AI found a better alternative fix than the PR s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

iOS Shell back button history menu does not update after runtime culture change

4 participants