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