在 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 中,一旦 viewDidLoadABPersonViewController 子视图控制器触发,随后对 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 重新加载/更改显示的人的主要内容,如果未能解决你的问题,请参考以下文章

如何使 AppStorage 变量仅在 iOS 14 上运行时可用?

ViewController 关闭 swift ios

[iOS开发]present和push

spring person

ios 分类

swift ios - 如何从 AppDelegate 在 ViewController 中运行函数