iOS中的Skip/ignore方法

iOS中的Skip/ignore方法,ios,objective-c,uitableview,Ios,Objective C,Uitableview,如何在iOS中跳过完整的方法?我知道如何在方法中测试iOS版本,但不知道如何完全忽略方法 具体示例:iOS8添加了自调整大小的表视图单元格,不再需要方法heightforrowatinexpath:和estimatedheightforrowatinexpath:。但我确实需要它们来做第七次失败。现在,当我在iOS8中逐步查看代码时,两种方法都会被调用,即使它们不再需要。您有一个UITableViewDelegate设置为UITableView的委托,并且您希望为不同版本的iOS提供不同的委托方

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


具体示例:iOS8添加了自调整大小的表视图单元格,不再需要方法
heightforrowatinexpath:
estimatedheightforrowatinexpath:
。但我确实需要它们来做第七次失败。现在,当我在iOS8中逐步查看代码时,两种方法都会被调用,即使它们不再需要。

您有一个
UITableViewDelegate
设置为
UITableView
的委托,并且您希望为不同版本的iOS提供不同的委托方法

UITableView
将在调用
[委托表视图:自高for rowatinexpath:indexPath]之前调用
[委托响应选择器:@selector(表视图:heightforrowatinexpath:)]

这需要定制。在
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];
}


更新:我修复了委托方法名称。哼

您将
UITableViewDelegate
设置为
UITableView
的委托,并且您希望为不同版本的iOS提供不同的委托方法

UITableView
将在调用
[委托表视图:自高for rowatinexpath:indexPath]之前调用
[委托响应选择器:@selector(表视图:heightforrowatinexpath:)]

这需要定制。在
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];
}


更新:我修复了委托方法名称。哼

根据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
@接口MyTableViewDelegate:NSObject
@结束
@接口MyTableViewDelegateiOS7:MyTableViewDelegate
-(CGFloat)tableView:(UITableView*)tableView-heightforrowatinexpath:(nsindepath*)indepath;
-(CGFloat)tableView:(UITableView*)tableView估计的权重为rowatinexpath:(nsindepath*)indepath;
@结束
@实现类:。。
// ..
-(void)负荷视图{
[超级加载视图];
如果([[[UIDevice currentDevice]systemVersion]比较:@“8.0”选项:NSNumericSearch]!=NSR取消搜索){
self.tableView.delegate=[[MyTableViewDelegate alloc]init];
}否则{
self.tableView.delegate=[[MyTableViewDelegateiOS7 alloc]init];
}
}
@结束

根据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
@接口MyTableViewDelegate:NSObject
@结束
@接口MyTableViewDelegateiOS7:MyTableViewDelegate
-(CGFloat)tableView:(UITableView*)tableView-heightforrowatinexpath:(nsindepath*)indepath;
-(CGFloat)tableView:(UITableView*)tableView估计的权重为rowatinexpath:(nsindepath*)indepath;
@结束
@实现类:。。
// ..
-(void)负荷视图{
[超级加载视图];
如果([[[UIDevice currentDevice]systemVersion]比较:@“8.0”选项:NSNumericSearch]!=NSR取消搜索){
self.tableView.delegate=[[MyTableViewDelegate alloc]init];
}否则{
self.tableView.delegate=[[MyTableViewDelegateiOS7 alloc]init];
}
}
@结束

您可以使用条件语句。(
#if
-
#else
-
#endif
)。这样就可以在编译时决定是否执行某些代码行。当然,但我要测试什么?@Koen这可能会有帮助,委托类可以有两种不同的实现,然后选择您创建的。听起来您最好的选择是将运行时检查作为方法的第一行,并在不需要时跳过整个正文。您可以使用条件。(
#if
-
#else
-
#endif
)。这样就可以在编译时决定是否执行某些代码行。当然,但我要测试什么?@Koen这可能会有帮助,委托类可以有两种不同的实现,然后选择要创建的。听起来最好的选择是将运行时检查作为方法的第一行,并在不需要时跳过整个正文。
MyTableViewController
UITableView
的代理(和DataSource)。如果我理解正确的话,你的回答表明另一个类充当委托人?没错。事实上,还有另外两个类,虽然iOS7是从另一个扩展而来的,所以你不会复制代码,只是在需要的地方添加iOS7功能。好的,我明白了。我想我以前读过关于使用单独的委托/数据源类的文章,但从来没有看到它的必要性。可能就是这样。@Koen,事实上,为数据源/委托创建一个自己的类总是更好的,因为这样可以提高可重用性,并允许根据单一负责原则编写代码。还可以看看去年的WWDC视频《UICollectionViews的进展》或类似视频。很明显,苹果也使用了这种方法。
MyTableViewController
UITableView
的代理(和datasouerce)。如果我理解正确的话,你的回答表明另一个类充当委托人?没错。事实上,还有另外两个类,虽然iOS7是从另一个扩展而来的,所以你不会复制代码,只是在需要的地方添加iOS7功能。好的,我明白了。我想我以前读过关于使用单独的委托/数据源类的文章,但从来没有看到它的必要性。这可能就是事实。@Koen,