如何根据运行时系统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 }
这解决了这个问题
- 如何在CloudKit中创build用户?
- 在Swift 2.2+中使用AnyGenerator(“for in”循环支持自定义类)
- 按属性IN数组筛选核心数据结果
- 如何隐藏SafariViewController中的完成button和search栏
- 如何强制视图呈现自己?
- UICollectionView performBatchUpdates同时插入,删除和移动
- 将variables传递给UIViewController中的自定义UITableViewCell
- iOS:当用户从IOS Xcode中的一个屏幕移动到另一个屏幕时,SVProgressHUD并不closures
- 自定义Google Sign In在GIDSignInDelegate协议上抛出exception