如何跳过iOS中的完整方法?我知道如何测试方法中的iOS版 ,但不知道如何完全忽略方法。
具体示例:iOS8添加了自定义表格视图单元格,不再需要方法heightForRowAtIndexPath:
和estimatedHeightForRowAtIndexPath:
。但我确实需要它们用于iOS7。现在,当我逐步浏览iOS8中的代码时,即使不再需要这两种方法,也会调用这两种方法。
答案 0 :(得分:5)
您有UITableViewDelegate
设置为UITableView
的委托,并且您希望向不同版本的iOS提供不同的委托方法。
UITableView
会在致电[delegate respondsToSelector:@selector(tableView:heightForRowAtIndexPath:)]
之前致电[delegate tableView:self heightForRowAtIndexPath:indexPath]
。
这需要自定义-respondsToSelector:
。在UITableViewDelegate
课程中添加此方法。
- (BOOL)respondsToSelector:(SEL)aSelector
{
// If this device is running iOS 8 or greater.
if ([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] != NSOrderedAscending) {
if (aSelector == @selector(tableView:heightForRowAtIndexPath:))
return NO;
if (aSelector == @selector(tableView:estimatedHeightForRowAtIndexPath:))
return NO;
}
return [super respondsToSelector:aSelector];
}
更新:我修复了委托方法名称。 DUH!的
答案 1 :(得分:3)
根据iOS版本提供不同的委托。这允许您将代码封装在有意义的命名块中(您的界面将指示它是iOS7)并且您不会使用respondsToSelector
做任何可能破坏您的类的子类的技巧实际上做想要使用这些方法。
@interface MyTableViewDelegate : NSObject <UITableViewDelegate>
@end
@interface MyTableViewDelegateiOS7 : MyTableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath;
@end
@implementation YourClass : .. <..>
// ..
- (void)loadView {
[super loadView];
if ([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] != NSOrderedAscending) {
self.tableView.delegate = [[MyTableViewDelegate alloc] init];
} else {
self.tableView.delegate = [[MyTableViewDelegateiOS7 alloc] init];
}
}
@end