[iOS 27 Beta]: tabBarController(_:shouldSelect:) delegate method silently no longer called — breaking tab selection interception

Summary

On iOS 27, tabBarController(:shouldSelect:) — the long-standing UITabBarControllerDelegate method accepting a UIViewController — is no longer invoked when the user taps a tab inside a SwiftUI TabView. Tab selection now routes exclusively through tabBarController(:shouldSelectTab:), the UITab-based variant introduced in iOS 18.

Impact

Any code that relies on tabBarController(_:shouldSelect:) to:

  • Intercept or prevent tab switches
  • Detect tab reselection
  • Propagate tab-change events to other subsystems (e.g., a JavaScript bridge in a hybrid app)

...will silently stop working on iOS 27. There are no compiler warnings, no deprecation notices, and no runtime assertions — the method simply is no longer called.

This affected react-native-bottom-tabs, a widely used open-source library, causing all tab screens beyond the first to render as blank/white after any tab tap (see: https://github.com/callstack/react-native-bottom-tabs/issues/529). The workaround is to implement tabBarController(_:shouldSelectTab:)

Reproduction

  1. Create a SwiftUI TabView with 3+ tabs.
  2. Set a UITabBarControllerDelegate on the underlying UITabBarController.
  3. Implement tabBarController(_:shouldSelect:) — e.g., to log or prevent selection.
  4. Run on iOS 26 → delegate method fires correctly.
  5. Run on iOS 27 Beta → delegate method is never called.

Request / Questions

  1. Is this an intentional behavioral change for iOS 27? If so, it constitutes an undocumented, silent API break for any code targeting UITabBarControllerDelegate. The old method still compiles and links without any warning.
  2. Will tabBarController(_:shouldSelect:) be formally deprecated with a corresponding compiler warning so developers can find and migrate affected call sites?
  3. Is tabBarController(_:shouldSelectTab:) now the exclusive interception point on iOS 27, even for apps that haven't fully migrated to the new UITab-based API?

We'd appreciate any official guidance so libraries and apps can ship iOS 27-compatible binaries with confidence.

Environment

  • Xcode 26.5 / 17F42
  • iOS 27 Beta
  • Reproducible in both UIKit and hybrid (React Native) contexts

That TabView uses UITabBarController under the hood is an internal implementation detail, and replacing its delegate or otherwise modifying the UITabBarController is not a supported path.

If you need full control over a UITabBarController within a SwiftUI view hierarchy, you can use UIViewControllerRepresentable to wrap the tab bar controller.

But it is very well documented on iOS docs

As the user interacts with a tab bar interface, the tab bar controller object sends notifications about the interactions to its delegate. The delegate can be any object you specify but must conform to the UITabBarControllerDelegate protocol. You can use the delegate to prevent specific tab bar items from being selected and to perform additional tasks when tabs are selected. You can also use the delegate to monitor changes to the tab bar that are made by the More navigation controller, which is described in more detail in The More navigation controller.

taken from https://developer.apple.com/documentation/uikit/uitabbarcontroller

is this doc also going to be updated?

Will this be fixed in a newer beta version ? Our app users who upgraded to beta are unable to access features inside the app. This is affecting all our versions for users on iOS 27 Beta.

We are also facing the similar issue in our app also.

[iOS 27 Beta]: tabBarController(_:shouldSelect:) delegate method silently no longer called — breaking tab selection interception
 
 
Q