重构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;