繁体   English   中英

Objective-C运行时开关类

[英]Objective-C runtime switch class

我将类MyClass定义为UITableViewHeaderFooterView的子类。 在iOS 6中,存在UITableViewHeaderFooterView类,并且所有类均正常工作。 在iOS 5中,类UITableViewHeaderFooterView不存在,并且MyClass不在运行时中注册。

在文件'objc-runtime.m'的注释中说:*第一次在图像中出现的类被视为“未连接”。 *它存储在unconnected_class_hash 如果该类的所有*超类都存在并且已经“连接”,则可以将新类*连接到其超类并移至class_hash以进行*正常使用。 否则,该类将在unconnected_class_hash *中等待,直到超类完成连接为止。

但是,当我动态创建UITableViewHeaderFooterView类作为UITableHeaderFooterView的子类时,MyClass没有连接(未调用+ load),并且出现错误:Interface Builder文件中的MyClass未知。 *由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[setValue:forUndefinedKey:]:此类与键arrowImageView的键值编码兼容。

如果我将UIView用作MyClass的超类,则会收到错误消息: *由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'为标识符(MyClass)注册的无效笔尖-笔尖必须仅包含一个顶级对象,该对象必须是UITableViewHeaderFooterView实例'

我看到了PSTCollectionView的实现(在使用class_setSuperclass函数的PSTRegisterClass函数中),但是我不理解这种解决方案。

如何在尝试注册MyClass之前动态创建UITableViewHeaderFooterView? 还是无论如何我都可以解决这个问题?

答案是不要依赖您计划支持的最早OS版本中不支持的OS类。 如果绝对必须使用UITableViewHeaderFooterView类,则将部署目标上移至6.0。 否则,将代码重构为使用iOS 5.x中确实存在的基类,然后在该基类上构建子类。

在我看来,尝试使用Objective C运行时进行修补以支持缺少的基类是浪费时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM