iOS 10 UITabBar 设置标题后可见更多项目

iOS 10 UITabBar more items visible after setting title

我的应用程序中有一个标签栏,标签栏项是 UITabBarItem 的子类。从服务器获取更新后,这些选项卡栏项目使用以下行从代码设置它们的标题:

[self setTitle:@"SomeText"];

此行运行后,之前隐藏的选项卡栏项目(在更多选项卡后面)在主选项卡区域中变得可见,并堆叠在其他选项卡的顶部。请参阅下面的屏幕截图。这只发生在 iOS 10(测试版)中。这是我的代码中的错误还是 iOS 10 中的问题?

我创建了一个最小的 XCode 项目并发布到 Github 以演示该问题:https://github.com/RippleAdder/TabStacks

只要您在 iOS 10 中以编程方式设置选项卡的标题,就会发生这种情况。我已确认这是 iOS 10 测试版中的错误。我打开了错误报告和雷达:openradar.appspot.com/27749026

我还发布了一个 Github 回购协议来演示该问题:https://github.com/RippleAdder/TabStacks

这个答案不会解决您的具体情况,但可以帮助其他人遇到同样的问题。

如果您使用 UIViewControllers tabBarItem 属性 设置标题,问题似乎就会出现。使用 UITabBarController tabBar 属性 应该可以解决问题。

所以而不是(例如):

tabBarController.viewControllers[0].tabBarItem.title = @"SomeText";

使用:

tabBarController.tabBar.items[0].title = @"SomeText";

更新

我们发现替换 UITabBarItem 是此 iOS10 错误的另一种解决方法:

UITabBarItem *item = tabBarController.viewControllers[0].tabBarItem;
tabBarController.viewControllers[0].tabBarItem = [[UITabBarItem alloc] initWithTitle:@"SomeText" image:item.image tag:item.tag];

移动

self.title = @"SomeText";

来自

- (void)awakeFromNib {}

- (void)viewDidLoad {}

我遇到的一个问题是在视图控制器中使用 self.title = @"Title" 设置标题会导致 tabBarItem 标题更改并导致此问题中的丑陋错误。我将其更改为 self.navigationItem.title = @"Title" 这似乎解决了问题。

我在这个我喜欢思考的问题上花了更多的时间。

但是为我解决的解决方法是围绕我创建的代码并在主线程上实际呈现 UITabBarItems 一个简单的 dispatch_async

dispatch_async(dispatch_get_main_queue(), {
    //your code here
}

正如我所说,这可能不是最好的解决方案,但最终是真正有效的解决方案。

希望 Apple 尽快解决此问题。

这个错误仍然发生在 iOS 11.3.

在我的应用程序中,我必须保持当前导航栏标题和当前选项卡标题同步,所以只有这个解决方案有效:

self.navigationItem.title = "Title"
self.tabBarController?.tabBar.items![0].title = self.navigationItem.title

感谢 @shady 的想法!

每次我想更新导航栏和标签栏中的标题时(当用户更改应用程序语言时)我都会调用此方法