当视图包含带有自定义图像的 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 失败的主要内容,如果未能解决你的问题,请参考以下文章
单击时在 uicollectionviewcell 中切换图像