【问题标题】:iOS 7 crash, iOS 6 OK - UINavigationBar: -[UILabel setTitleTextAttributes:]: unrecognized selector sent to instanceiOS 7 崩溃,iOS 6 OK - UINavigationBar: -[UILabel setTitleTextAttributes:]: unrecognized selector sent to instance
【发布时间】:2014-08-03 01:51:08
【问题描述】:

我有一个应用程序,我很久以前就在开发,但从未完成。最近又开始研究它,我遇到了一个问题。

iOS 6 上,此代码可以正常工作:

UINavigationBar *modalNavBar = [editView.subviews objectAtIndex:0];

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor blackColor], UITextAttributeTextColor, nil];
[modalNavBar setTitleTextAttributes:dict];

但在 iOS 7 上它会崩溃并给出以下错误:

-[UILabel setTitleTextAttributes:]:无法识别的选择器发送到实例

该方法被清楚地识别,因为它出现在 UINavigationBar 对象的可用方法列表中。

我已经阅读了一些关于使用 NSForegroundColorAttributeName 而不是 UITextAttributeTextColor 的内容,但这并不能解决 iOS 7 上的问题iOS 6 导致颜色不被应用。

对此问题的解决方案有何建议?

【问题讨论】:

标签: ios7 uinavigationbar


【解决方案1】:

iOS7 和 iOS6 中子视图的排序方式可能有所不同?我注意到错误说 UILabel 没有选择器 setTitleTextAttributes:,实际上它没有。但是您的代码表明您希望该对象是一个 UINavigationBar ......但显然它是一个 UILabel 。所以...

UINavigationBar *modalNavBar = [editView.subviews objectAtIndex:0];

...正在返回错误类型的对象。出于某种原因,当您在 iOS7 上运行时,您在索引 0 处有一个 UILabel,但在您在 iOS6 上运行时,该索引处有一个 UINavigationBar。

【讨论】:

  • 啊!事后看来是 20/20。我进行了更改以迭代子视图,直到找到 UINavigationBar 并使用它并且它可以工作。
  • 我遍历controller.view.subviews 找到一个UITabBarCustomizeView,然后遍历它找到一个UINavigationBar。适用于 iOS 6,但不适用于 iOS 7,但至少不会崩溃。
【解决方案2】:

尝试使用已记录的属性获取导航栏。例如,navigationController.navigationBar.titleTextAttributes = textAttributes;。虽然一个 iOS 版本可能会将导航栏放置在子视图数组的索引 0 处,但另一个版本可能会添加另一个视图,以便导航栏不再位于该索引处。

【讨论】:

  • 好主意。现在弄清楚我应该在 - (void)tabBarController:(UITabBarController *)controller willBeginCustomizingViewControllers:(NSArray *)viewControllers. 中使用什么
  • controller.navigationController.navigationBar 和 controller.moreNavigationController.navigationBar 都不正确,所以我想我需要遍历子视图,直到找到一个 UINavigationBar,它确实有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
相关资源
最近更新 更多