UITabBarController Titles Not Updating After Runtime Localization (iOS 18 Regression)

Starting with iOS 18, UITabBarController no longer updates tab bar item titles when localized strings are changed or reassigned at runtime.

This behavior worked correctly in iOS 17 and earlier, but in iOS 18 the tab bar titles remain unchanged until the app restarts or the view controller hierarchy is reset. This regression appears to be caused by internal UITabBarController optimizations introduced in iOS 18.

Steps to Reproduce

  • Create a UITabBarController with two or more tabs, each having a UITabBarItem with a title.
  • Localize the tab titles using NSLocalizedString():
tabBar.items?[0].title = NSLocalizedString("home_tab", comment: "")
tabBar.items?[1].title = NSLocalizedString("settings_tab", comment: "")
  • Run the app.
  • Change the app’s language at runtime (without restarting), or manually reassign the localized titles again:
tabBar.items?[0].title = NSLocalizedString("home_tab", comment: "")
tabBar.items?[1].title = NSLocalizedString("settings_tab", comment: "")
  • Observe that the tab bar titles do not update visually.

Apple's localization APIs don't support changing the localization at runtime. Given your code it is very likely that NSLocalizedString is no longer changing its values in response to whatever change your making, as UITabBarItem just sees strings and displays them.

UITabBarController Titles Not Updating After Runtime Localization (iOS 18 Regression)
 
 
Q