如何根据运行时系统iOS版本覆盖方法?

我已经使用iOS实现了iOS 8的自动动态tableview单元格高度

self.tableView.rowHeight = UITableViewAutomaticDimension; 

对于不支持自动动态单元格高度的iOS 8之前的版本,我重写了heightForRowAtIndexPath方法。

这与我的做法类似: 在UITableView中使用自动布局来实现动态单元格布局和可变行高

问题是如何为iOS 8编写使用自动单元格高度的代码,但是为早期iOS版本覆盖heightForRowAtIndexPath。 仅当iOS版本小于8时,我才会喜欢我的自定义heightForRowAtIndexPath方法。有关如何执行此操作的建议吗?

一种解决方案是覆盖视图控制器中的respondsToSelector:方法。 在检查heightForRowAtIndexPath:方法时,它在iOS 8下返回NO

 - (BOOL)respondsToSelector:(SEL)selector { static BOOL useSelector; static dispatch_once_t predicate = 0; dispatch_once(&predicate, ^{ useSelector = [[UIDevice currentDevice].systemVersion floatValue] < 8.0 ? YES : NO; }); if (selector == @selector(tableView:heightForRowAtIndexPath:)) { return useSelector; } return [super respondsToSelector:selector]; } 

这样,当表视图调用时,如:

 if ([self.delegate respondsToSelector:@selector(tableView:heightForRowAtIndexPath:)]) { } 

您的代码将在iOS 8或更高版本下返回NO ,在iOS 7或更早版本下返回YES

我找到了一个简单的解决方 声明此宏以识别用户是否具有iOS 8.0或更高版本:

 #define IS_IOS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) 

然后,在heightForRowAtIndexPath里面我添加了以下代码:

 if (IS_IOS_8_OR_LATER) { self.tableView.rowHeight = UITableViewAutomaticDimension; return self.tableView.rowHeight; } else {//Custom code for ios version earlier than 8.0 } 

这解决了这个问题