iOS 6故事板与UIPopoverController目标崩溃的样式Popover Segue

时间:2012-12-22 22:10:19

标签: ios uipopovercontroller uistoryboard

我有一个带有主ViewController的iPad应用程序,里面有一个UIButton。这与带有Popover样式的segue绑定,目标是UIPopoverController类(空,来自Xcode的'使用UIPopoverController子类创建新')。

当我点击按钮时,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。当它是那个类时,这个工作正常,除了我不能以任何方式以编程方式解除popover。这是我将目标类切换为UIPopoverController的唯一原因。

1 个答案:

答案 0 :(得分:2)

来自NSCoding Protocol Ref

  

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

     

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

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

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

可是:

  

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

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

希望这能澄清它。