我想使用这个开源组件:
https://github.com/CEWendel/SWTableViewCell
在iOS 7 ++上工作正常,但在iOS 6上崩溃。
我需要知道是否有任何内置宏可以让我做这样的事情:
#if __CURRENT_IPHONE_OS_VERSION >= __IPHONE_7_0
#import "SWTableViewCell.h"
@interface PPTimerCell : SWTableViewCell
#else
@interface PPTimerCell : UITableViewCell
#endif
提前致谢!
答案 0 :(得分:0)
如评论中所述,#if
是编译时条件,而不是在运行时适用的条件。如果你想继续你的方向,你需要一种在运行时改变行为的方法。
同样如评论中所述......对于不在iOS 7.0或更高版本上的少数用户来说,这个问题的额外开发,维护和支持是否值得? Apple's latest usage statistics说这个数字是4%(并且很可能在缩小)。您可以更轻松地削减6.0支持。
另请注意,SWTableViewCell
提供的操作细分功能为built-in on iOS 8。您可以通过使用内置API在iOS 8上执行滑动操作来减少对第三方代码的依赖。 (不是说你应该,只是考虑你如何花费你的开发/ QA资源。)
在运行时更改超类的一般情况很难 - 如果必须,请进一步查看。但是你正在为表格单元格做这件事 - 表格视图很容易have the class of each cell set at run time。您可以重构代码,以便在一个操作系统版本上实例化UITableViewCell
子类,在另一个操作系统版本上实例化SWTableViewCell
子类 - 而不是复制这些类共享的代码,将代码放入第三类,其中一个实例由其他两个引用。
所以,您正在寻找条件继承问题的一般解决方案?好吧,它快速进入黑暗的地方。
如果您正在使用某个版本的iOS上存在(即链接)的类而不是另一个版本,则编译器的@compatiblity_alias
功能可能会对您有所帮助。这声明了一个类名作为另一个类的替代 - 几年前使用第三方库(如PSTCollectionView
)作为UICollectionView
的向后兼容替代品很方便,但这在iOS中引入6并且没有人认真地试图回到iOS 5了。无论如何,由于@compatibility_alias
依赖于符号链接,要在你的情况下使用它,你需要让链接器在iOS 7+上引入你的库而不是在iOS 6上,我不认为这可以是完成。
如果 确实 想要创建一个在运行时其父项可能不同的类,则必须使用ObjC运行时API在运行时创建该类。调用objc_allocateClassPair
创建课程。请注意,使用ObjC运行时并不适合胆小的人,尽管它上面有some good writeups。但是,你可能不想这样做。