当视图包含带有自定义图像的 UIButton 时,UIViewController encodeWithCoder 失败

Posted

技术标签:

【中文标题】当视图包含带有自定义图像的 UIButton 时,UIViewController encodeWithCoder 失败【英文标题】:UIViewController encodeWithCoder fails when view contains a UIButton with custom image 【发布时间】:2011-09-28 21:26:24 【问题描述】:

基本上,我的问题正是标题中所说的。当我尝试编码UIViewController 的子类时,调用[super encodeWithCoder] 会得到NSInvalidArgumentException。具体来说,我得到-[UIImage encodeWithCoder:]: unrecognized selector sent to instance XxXXXXXX

视图中唯一的图像图像位于UIButton 上,它也应该符合NSCoding,并且堆栈跟踪包括对[UIBUtton encodeWithCoder] 的调用。按钮是使用[UIButton buttonWithType:UIButtonTypeCustom] 以编程方式创建的,而图像是使用setImage: forState: 设置的。我真的不知道这里发生了什么。我是否遗漏了一些明显的东西,或者UIButton 只是不符合NSCoding

【问题讨论】:

【参考方案1】:

我无法想象您为什么要在应用中归档视图对象,但您可能需要通过在 UIImage 上编写类别来自己添加 NSCoding 支持。

详情见:iPhone - Why does the documentation say UIImageView is NSCoding compliant?

视图对象支持 NSCoding,因为视图加载系统使用它从 Nib 文件加载对象。但是 UINib 类做了一些 NSKeyedArchiver 没有做的额外工作。

如果您只想在启动之间存储状态,最好存储数据而不是查看状态。特别是如果您计划更新您的应用程序并对视图布局进行任何更改。 (这就是模型/视图/控制器分离背后的动机。)

【讨论】:

所以基本上,符合 NSCoding 并不意味着苹果所说的意思。感谢您的链接,我搜索了但我没有遇到。 它意味着它所说的,它只是没有说出你的想法。例如,一个 NSCoding 类可能支持键控归档或经典归档,或两者都支持,或都不支持。没有任何保证。

以上是关于当视图包含带有自定义图像的 UIButton 时,UIViewController encodeWithCoder 失败的主要内容,如果未能解决你的问题,请参考以下文章

带有图像的自定义 UIButton

UIButton setImage 不适用于自定义注释视图

自定义视图中未调用 UIButton 操作

单击时在 uicollectionviewcell 中切换图像

UITableview单元格图像中的uiimageview中的UIButton没有改变

具有自定义层的 UIButton 的子类不会完全填充相邻视图的空间