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

时间:2014-09-24 16:36:09

标签: ios ios8 tableview tableviewcell

我已经使用

为iOS 8实现了自动动态tableview单元格高度
self.tableView.rowHeight = UITableViewAutomaticDimension;

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

这与我的做法类似:Using Auto Layout in UITableView for dynamic cell layouts & variable row heights

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

2 个答案:

答案 0 :(得分:19)

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

- (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

答案 1 :(得分:1)

我找到了一个简单的解决方案。 声明此宏以识别用户是否具有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

}

这解决了问题