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

最佳答案

NSCoding Protocol Ref


  NSCoding协议声明了一个类必须实现的两个方法,以便可以对该类的实例进行编码和解码。此功能为归档(将对象和其他结构存储在磁盘上)和分发(将对象复制到不同的地址空间)提供了基础。
  
  编码人员通过调用encodeWithCoder:或initWithCoder:来指示对象这样做。 encodeWithCoder:指示对象将其实例变量编码到提供的编码器中;一个对象可以多次接收此方法。 initWithCoder:指示对象从提供的编码器中的数据初始化自身;这样,它将替换任何其他初始化方法,并且每个对象仅发送一次。任何应编码的对象类都必须采用NSCoding协议并实现其方法。


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

现在,发生了UIPopoverController不符合NSCoding协议的情况(请参阅reference document,刚开始时它说:“符合”:此处未列出NSCoding。)

但:


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


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

希望这可以澄清它。

关于ios - 具有UIPopoverController目标的Popover风格的iOS 6 Storyboard Segue崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14006986/

10-11 06:52