0

我有一个带有主 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 的唯一原因。

4

1 回答 1

2

来自NSCoding 协议参考

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

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

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

现在,它发生了UIPopoverController不符合NSCoding协议的情况(请参阅参考文档,就在开头,它说:“符合”:那里没有列出 NSCoding。)

但:

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

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

希望这可以澄清它。

于 2012-12-22T23:21:45.100 回答