Using `compactTabIdentifiers` and other iOS 18+ tab APIs

Hello I'm working on implementing some changes to my app's tab bar, particularly to support some features in the new iPad floating tab bar, which has required me to adopt some of the new tab APIs from iOS 18.

The issue I've encountered is that I would like the tabs visible in regular (floating tab bar) and compact (bottom tab bar) to be slightly different. The compact variant should show a subset of the tabs visible on iPad. For example:

Floating tab bar: Use tabs A, B, C Bottom tab bar: Use tabs A, B

I'm finding this quite difficult, especially in the scenario of split view on iPad, where the size class and tab bar location can change as the user interacts with the app.

I went down the route of changing my tab bar controller's tabs property when the trait collection changed

tabBarController.tabs = eligibleTabs

where eligibleTabs for compact passes tabs AB, and when in regular - ABC. This throws an exception

UIViewController cannot be shared between multiple UITab *** Assertion failure in -[UITab viewController], UITab.m:173

I'm not sharing view controllers between tabs. I can only assume that the system doesn't like me passing the same values (always at least tabs A & B) multiple times to the tabs property.

I then later noticed a new iOS 18 property on UITabBarController - compactTabIdentifiers. This seemed like exactly what I was looking for: An optional filter to display only select root-level tabs when in a compact appearance. Default is nil, which would make all tabs available.

So I changed my implementation:

tabBarController.tabs = [tabA, tabB, tabC] tabBarController.compactTabIdentifiers = [tabAIdentifier, tabBIdentifier]

and don't make any explicit updates when split view is enabled.

Unfortunately this doesn't seem to work, at least not how I would expect it to. When enabling split view on iPad, the bottom tab bar appears, but it doesn't respect the tab identifiers I passed in tabBarController.compactTabIdentifiers.

I'm not sure if this a bug or that I'm not really understanding how to use tabBarController.compactTabIdentifiers.

Does anyone have any insight on this?

It's a little unclear from your description what could be wrong. If you file a feedback through Feedback Assistant with a sample project that outlines your setup, it could help us better diagnose the issue for you. Once you filed the issue, reply back with the FB number.

Using `compactTabIdentifiers` and other iOS 18+ tab APIs
 
 
Q