如何根据iOS版本设置超类?

时间:2014-12-15 17:42:25

标签: ios objective-c uitableview

我想使用这个开源组件:

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

提前致谢!

1 个答案:

答案 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。但是,你可能不想这样做。