重构iOS7和iOS8的UITableView委托

作为这个问题的后续行动: 在iOS中跳过/忽略方法 ,我试图在iOS7和iOS8中为我的UITableView实现单独的委托。

所以,作为第一步,在MyTableViewController viewDidLoad中,我添加了下面的代码:

 if ([[[UIDevice currentDevice] systemVersion] compare: @"8.0" options: NSNumericSearch] != NSOrderedAscending) { [self.tableView setDelegate: [[MyTVDelegate alloc] initWithIdentifier: myTVCellIdentifier]]; } else { [self.tableView setDelegate: [[MyTVDelegate7 alloc] initWithIdentifier: myTVCellIdentifier]]; } 

我添加一个标识符,因为我将不得不将这个应用到多个视图控制器(或者我可能只是为每个电视创build一个委托类,我还没有想出来)。

我正在使用CoreData ,所以我的dataSource是一个NSFetchedResultsController

然后,我有以下MyTVDelegate/myTVDelegate7

 #import "MyTVDelegate.h" @implementation MyTVDelegate - (instancetype)initWithIdentifier: (NSString *) identifier { if ([super init]) { self.identifier = identifier; } return self; } @end @implementation MyTVDelegate7 - (CGFloat)tableView: (UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *)indexPath { return 44; } - (CGFloat)tableView: (UITableView *)tableView estimatedHeightForRowAtIndexPath: (NSIndexPath *)indexPath { return UITableViewAutomaticDimension; } @end 

如果我运行这个,我得到在iOS7下面的运行时错误:

 2015-01-18 10:42:51.894 -[__NSArrayI tableView:estimatedHeightForRowAtIndexPath:]: unrecognized selector sent to instance 0x7b9dd220 2015-01-18 10:42:57.731 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI tableView:estimatedHeightForRowAtIndexPath:]: unrecognized selector sent to instance 0x7b9dd220' 

在iOS8上,没有崩溃。

实例0x7b9dd220是一个NSArray 。 我的直觉是它崩溃,因为indexPath是无效的,因为delegate和'dataSource'现在是分开的?

我已经尝试移动调用performFetch之前或之后设置委托,但我得到同样的错误。

我如何解决这个问题,我是否应该将所有NSFetchedResultsController代码移动到新的委托类中?

self.tableView setDelegate:分配一个weak引用; 如果你没有自己的引用这个对象,它会被收集。 这就是你看到崩溃的原因。 系统已收集分配给您的委托的内存,然后将内存重新分配给NSArray 。 你的表试图调用委托的方法,不能因为NSArray不响应它们。

self.tableView属性定义之外,定义另一个属性:

 @property (strong) id<UITableViewDelegate> myTableViewDelegate;