在 iOS 7 上使用 Person ViewController 重新加载/更改显示的人
Posted
技术标签:
【中文标题】在 iOS 7 上使用 Person ViewController 重新加载/更改显示的人【英文标题】:Reloading/changing displayed person with ABPersonViewController on iOS7 【发布时间】:2013-09-15 09:56:25 【问题描述】:我有一个包含ABPersonViewController
子视图控制器的类。在ios7之前,我可以多次传递setDisplayedPerson:
消息,更新或替换显示的信息。然而,在 iOS7 中,一旦 viewDidLoad
为 ABPersonViewController
子视图控制器触发,随后对 setDisplayedPerson:
的任何调用似乎都会被忽略。
我可以用另一个子视图控制器替换子视图控制器,甚至动画它们之间的过渡,但这很不雅。
对此有一个开放的雷达:rdar://14682982
有人看过吗?
编辑:问题已在 iOS8 beta 1 中得到解决。
【问题讨论】:
我已经有一段时间没玩过 ABPersonViewController 了,但 iOS 7 仍然是 IMO 的 bug,所以这可能值得作为 Apple 的 bug 提出。 哦,我从 beta 4 开始就这个问题向 Apple 提交了一个错误报告。他们还没有修复它。 我还有 4 个未解决。 是的,这里也有很多打开的,还有很多重复的并且仍然打开。真是一团糟。 【参考方案1】:作为一种临时解决方法,如果ABPersonViewController
已经出现,您可以通过self.navigationController.topViewController.childViewControllers.firstObject
获取ABContactViewController
并调用reloadData:
以重新加载显示的人员信息。
【讨论】:
如果当前显示的人已经改变,这不只是刷新,而不是如果你完全改变了显示的人(不同ABRecordRef
)?
是的,这只会帮助重新加载,不会改变。刚刚发现ABContactViewController
有无证选择器updateWithNewContact:
,现在就测试一下。
好吧,它适用于一些严重无证的解决方法,例如:[controller performSelector: NSSelectorFromString(@"updateWithNewContact:") withObject: [[NSClassFromString(@"CNContact") alloc] initWithRecord: newRecordRef]]
;但联系人图片丢失。
我在测试版中也这样做了,但当时没有用。所以我想我们可以把它看作是一个迹象,也许在 iOS9 的时间范围内,他们会修复它。 ;)
他们应该只暴露 ContactViewController 和 CNContact,而不是丑陋的 ABRecordRef。就像他们对 EventKit 有一个包装器一样。我想,问题在于 CNContact 完全来自另一个框架,这里是“借来的”。【参考方案2】:
该问题已在 iOS8 测试版中得到解决。
【讨论】:
【参考方案3】:我一直在处理同样的问题。我目前的解决方案是将ABPersonViewController
作为属性(我在几个地方需要它)延迟实例化,并在使用它之前将其设置为nil。这样我总有一个新的可以使用。
【讨论】:
如果你想在显示一个后替换显示的人,这还不够。我最终做的是为每个人设置一个子视图控制器,如果显示前一个,我会使用淡入淡出转换视图。以上是关于在 iOS 7 上使用 Person ViewController 重新加载/更改显示的人的主要内容,如果未能解决你的问题,请参考以下文章