在数组块枚举中创建UITableView会导致崩溃

时间:2016-03-24 19:50:21

标签: ios objective-c uitableview objective-c-blocks retain

所以故事是这样的:)

我试图在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。这解决了我的问题。谢谢

1 个答案:

答案 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>