检查当前 viewController 类是不是为 IOS 7 中的 Person ViewController 时出现问题

Posted

技术标签:

【中文标题】检查当前 viewController 类是不是为 IOS 7 中的 Person ViewController 时出现问题【英文标题】:Issue when checking if current viewController class is ABPersonViewController in IOS 7检查当前 viewController 类是否为 IOS 7 中的 Person ViewController 时出现问题 【发布时间】:2013-10-04 12:42:54 【问题描述】:

我正在加载ABPeoplePickerNavigationController。在人员选择器中单击联系人时,我正在检查条件

if([navigationController isKindOfClass:[ABPeoplePickerNavigationController class]]
   && [viewController isKindOfClass:[ABPersonViewController class]])

  //Statements


但在 ios 7 中,我注意到第二个条件,即

[viewController isKindOfClass:[ABPersonViewController class]

始终返回 NO。我知道加载的视图控制器是ABPersonViewController。 在 IOS 6 之前,这一直/正在正常工作。可能是什么问题?无论如何我可以解决这个问题。

编辑:

条件在UINavigationControllerDelegate 内部检查

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

viewController 类在登录时显示为ABContactViewController

【问题讨论】:

日志或调试器说明它是什么类? @Mundi 它说 ABContactViewController。 UINavigationController 委托方法中的@Rob 嗯,这就是你的答案。这不是ABPersonViewController。至于为什么这是一个内部类而不是另一个,我不能说(顺便说一句,我有一个不同的类,ABMembersViewController)。可能是一个类集群。问题是您是否真的需要检查 AddressBookUI 框架内部使用的控制器的类。如果需要,您也可以更新代码以检查 ABContactViewController。但是,让我感到震惊的是,这总是很脆弱,受制于他们未来所做的任何内部实现更改。 我尝试使用ABContactViewController 代替ABPersonViewController。但ABContactViewController 无法识别 【参考方案1】:

检查你的类时你会发现iOS7返回了不同的类型。

查看您需要检查的逻辑。您不必使用自省来对人员选择器操作做出适当的反应。只需从 ABPeoplePickerNavigationControllerDelegate 实现标准委托方法。特别是,您必须实现:

- (BOOL)peoplePickerNavigationController:
    (ABPeoplePickerNavigationController *)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person;

【讨论】:

我已经实现了- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person。我使用导航控制器委托为联系人选择器和 ABPersonViewController 提供不同的导航栏。这就是为什么我检查navigationController 是否为ABPeoplePickerNavigationController 而viewController 是否为ABPersonViewController 那是一个不同的导航控制器。尝试在不检查类的情况下实现此逻辑。您不应依赖 Apple 可能随时更改的类。

以上是关于检查当前 viewController 类是不是为 IOS 7 中的 Person ViewController 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS 检查 ViewController 实例是不是打开并切换 ViewControllers

如何检查视图而不是 viewController 是不是可见?

iOS:如何检查一个变量是不是在 dispatch_async 的另一个 ViewController 中改变了他的值?

检查弹出的 UIViewController 是不是被滑动关闭

iOS 登录 viewcontroller 最佳实践

在 Swift 的外部方法中获取当前的 ViewController