在iOS中跳过/忽略方法

时间:2015-01-14 14:04:12

标签: ios objective-c uitableview

如何跳过iOS中的完整方法?我知道如何测试方法中的iOS版 ,但不知道如何完全忽略方法。

具体示例:iOS8添加了自定义表格视图单元格,不再需要方法heightForRowAtIndexPath:estimatedHeightForRowAtIndexPath:。但我确实需要它们用于iOS7。现在,当我逐步浏览iOS8中的代码时,即使不再需要这两种方法,也会调用这两种方法。

2 个答案:

答案 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