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

ami*_*rfl 12 tableview tableviewcell ios ios8

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

self.tableView.rowHeight = UITableViewAutomaticDimension;
Run Code Online (Sandbox Code Playgroud)

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

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

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

rma*_*ddy 19

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

- (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];
}
Run Code Online (Sandbox Code Playgroud)

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

if ([self.delegate respondsToSelector:@selector(tableView:heightForRowAtIndexPath:)]) {
}
Run Code Online (Sandbox Code Playgroud)

您的代码将NO在iOS 8或更高版本以及YESiOS 7或更早版本下返回.

  • @Koen更好的解决方案是创建自己的`UITableViewController'子类并在那里添加方法.这使您的所有表视图控制器扩展您的自定义类. (2认同)