Skip/ignore iOS 中的方法
Skip/ignore method in iOS
如何跳过iOS中的完整方法?我知道如何在 方法中测试 iOS 版本 ,但不知道如何完全忽略方法。
具体示例:iOS8 添加了自调整table 视图单元格,不再需要heightForRowAtIndexPath:
和estimatedHeightForRowAtIndexPath:
方法。但是 iOS7 我确实需要它们。现在,当我单步执行 iOS8 中的代码时,这两个方法都会被调用,即使它们不再需要。
您将 UITableViewDelegate
设置为 UITableView
的委托,并且您希望向不同版本的 iOS 提供不同的委托方法。
UITableView
会在调用 [delegate tableView:self heightForRowAtIndexPath:indexPath]
.
之前调用 [delegate respondsToSelector:@selector(tableView:heightForRowAtIndexPath:)]
这需要自定义 -respondsToSelector:
。在你的 UITableViewDelegate
class 添加这个方法。
- (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
做任何可能破坏 subclass 的诡计您 class 的 es 实际上 确实 想要使用这些方法。
@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
如何跳过iOS中的完整方法?我知道如何在 方法中测试 iOS 版本 ,但不知道如何完全忽略方法。
具体示例:iOS8 添加了自调整table 视图单元格,不再需要heightForRowAtIndexPath:
和estimatedHeightForRowAtIndexPath:
方法。但是 iOS7 我确实需要它们。现在,当我单步执行 iOS8 中的代码时,这两个方法都会被调用,即使它们不再需要。
您将 UITableViewDelegate
设置为 UITableView
的委托,并且您希望向不同版本的 iOS 提供不同的委托方法。
UITableView
会在调用 [delegate tableView:self heightForRowAtIndexPath:indexPath]
.
[delegate respondsToSelector:@selector(tableView:heightForRowAtIndexPath:)]
这需要自定义 -respondsToSelector:
。在你的 UITableViewDelegate
class 添加这个方法。
- (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
做任何可能破坏 subclass 的诡计您 class 的 es 实际上 确实 想要使用这些方法。
@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