iOS 6 Storyboard Segue 风格 Popover 与 UIPopoverController 目标崩溃

Posted

技术标签:

【中文标题】iOS 6 Storyboard Segue 风格 Popover 与 UIPopoverController 目标崩溃【英文标题】:iOS 6 Storyboard Segue with style Popover with UIPopoverController target crashes 【发布时间】:2012-12-22 22:10:19 【问题描述】:

我有一个带有主 ViewController 的 iPad 应用程序,其中我有一个 UIButton。这与具有样式 Popover 的 segue 相关联,其目标是 UIPopoverController 类(空,来自 Xcode 的带有 UIPopoverController 子类的“create new”)。

当我单击按钮时,segue 会执行并崩溃:

2012-12-22 16:58:57.275 iAmFrustratedApp[11521:c07] -[MyGreatPopoverController initWithCoder:]: unrecognized selector sent to instance 0x1caabe70
2012-12-22 16:58:57.277 iAmFrustratedApp[11521:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MyGreatPopoverController initWithCoder:]: unrecognized selector sent to instance 0x1caabe70'
*** First throw call stack:
(0x22fe012 0x148fe7e 0x23894bd 0x22edbbc 0x22ed94e 0x5f3ae9 0x702a02 0x7020e5 0x5f367b 0x702a02 0x702418 0x7020e5 0x5f2aa3 0x81e48a 0x81ea83 0x81eb54 0x14a3705 0x3da920 0x3da8b8 0x49b671 0x49bbcf 0x49ad38 0x40a33f 0x40a552 0x3e83aa 0x3d9cf8 0x1bacdf9 0x2281f3f 0x228196f 0x22a4734 0x22a3f44 0x22a3e1b 0x1bab7e3 0x1bab668 0x3d765c 0x1cbd 0x1be5)
libc++abi.dylib: terminate called throwing an exception

有趣的是,我曾经让这个目标是一个普通的 UIViewController。当它是那个类时,它工作正常,除了我不能以任何方式以编程方式关闭弹出窗口。这就是我将目标类切换为 UIPopoverController 的唯一原因。

【问题讨论】:

您似乎在情节提要中将某些东西的类设置为MyGreatPopoverController 。 UIPopoverController 不符合 NSCoding 正确——我设置了一个类,其行为类似于弹出框内的内容。它曾经是我在 IB 中创建的 UIVC 的子类。然后我转到类定义并将:UIViewController 更改为:UIPopoverController。这是我悲伤的根源吗?为什么这不起作用? 它不起作用,因为 UIPopoverController 无法从 NIB 实例化(这就是为什么我对 NSCoding 进行讽刺,这就是协议存在的全部原因:从 nib 中解压缩对象) 【参考方案1】:

来自NSCoding Protocol Ref:

NSCoding 协议声明了一个类必须实现的两个方法,以便可以对该类的实例进行编码和解码。这种能力为归档(对象和其他结构存储在磁盘上)和分发(对象被复制到不同的地址空间)提供了基础。

编码器通过调用 encodeWithCoder: 或 initWithCoder: 来指示对象这样做。 encodeWithCoder:指示对象将其实例变量编码为提供的编码器;一个对象可以多次接收此方法。 initWithCoder:指示对象从提供的编码器中的数据初始化自己;因此,它取代了任何其他初始化方法,并且每个对象仅发送一次。任何应该可编码的对象类都必须采用 NSCoding 协议并实现其方法。

xib 文件只是由编码对象组成的存档。当您加载一个 xib 时,框架会将它们解码回(通过initWithCoder)为填充您的应用程序的对象。

现在,UIPopoverController 碰巧不符合 NSCoding 协议(请参阅 reference document,就在开头,它说:“符合”:那里没有列出 NSCoding。)

但是:

任何应该可编码的对象类都必须采用NSCoding 协议并实现其方法。

因此,当框架找到您UIPopoverController 派生类实例并尝试对其进行解码时,它会失败。

希望这可以澄清它。

【讨论】:

Sergio - 谢谢,但我怎样才能让弹出框内的 UIViewController 关闭?我尝试了几种方法(解雇自我,从调用 VC 解雇)但没有成功。这就是我尝试使用 UIPopoverController 的全部原因。如果我使用popover风格的segues,我不应该使用UIPopoverController,这是一个真实的陈述吗?我意识到我问的问题与原始帖子略有不同 我找到了这个 S.O.似乎为您要完成的工作提供了确切的秘诀的问题:***.com/questions/8287242/…

以上是关于iOS 6 Storyboard Segue 风格 Popover 与 UIPopoverController 目标崩溃的主要内容,如果未能解决你的问题,请参考以下文章

iOS如何获取对带有segue的storyboard容器中嵌入的视图控制器的引用?

IOS / Objective-C / Storyboard:从左到右的自定义Segue在视图控制器之间创建黑条

使用 Storyboard Segue iOS 将数据传递给视图控制器

Storyboard segue 有时会将我的视图控制器部分放在屏幕之外

XCode/iOS:将 UIGestureRecognizerDelegate 添加到 UIViewController 后,Storyboard Segue 事件不起作用

Xcode 6.4 中已弃用的 segue