所以故事是这样的:)
我试图在NSArray中阻止枚举对象,并为每个对象动态创建UITableViews并将它们添加到UIScrollView中。我为了可读性和可重用性而使用Lighter View Controllers from www.objc.io。为每个UITableView分别创建dataSource。问题是我一直在崩溃
-[NSObject(NSObject) doesNotRecognizeSelector:]
我从堆栈上的帖子中发现,块枚举中的对象因速度问题而保留较弱,并且可以确认dataSource实际上已为每个表解除分配。
我甚至尝试用__strong初始化ArrayDataSource但没有效果。
__strong ArrayDataSource *customdayTableDataSource = [[ArrayDataSource alloc] initWithConfigureCellBlock:configureCell cellIdentifier:DayTableCellIdentifier];
我在街区做错了什么?你能指点我正确的方向吗?
TableViewCellConfigureBlock configureCell = ^(id cell, id object) {
[cell configureForObject:object];
};
[NSArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
int tableHorizontalPosition = [[UIScreen mainScreen] bounds].size.width * idx;
int tableHeight = [[UIScreen mainScreen] bounds].size.height;
UITableView *table = [[UITableView alloc] initWithFrame:CGRectMake(tableHorizontalPosition, 0, [[UIScreen mainScreen] bounds].size.width, tableHeight) style:UITableViewStylePlain];
[table setDelegate:self];
ArrayDataSource *customDataSource = [[ArrayDataSource alloc] initWithConfigureCellBlock:configureCell cellIdentifier:MyCellIdentifier];
[customTableDataSource setOriginalData:[NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil]];
[table setDataSource:customTableDataSource];
[[self myUIScrollView] addSubview:table];
}];
如rmaddy所指出的那样,我将每个dataSource添加到一个在块范围之外初始化的NSArray。这解决了我的问题。谢谢
答案 0 :(得分:0)
正如人们在评论中所说的那样,你必须在某个地方建立自己的数据,这样他们将会活跃起来#34;只要tableviews,或者更简单的解决方案就是使用objc_setAssociatedObject创建强引用
在你的班级中声明一些static char strongReferenceKey
并在您的块中,在设置数据源之后,执行:
objc_setAssociatedObject(table, &strongReferenceKey, customDataSource, OBJC_ASSOCIATION_RETAIN);
那样表就会对数据源有很强的引用,当表被解除分配时,它将被释放。
P.S。确保导入runtime.h:
#import <objc/runtime.h>