我正在为UITableView中的单元格编写不同的附件。
我需要按行指定它们。
我编写了一个dataSource NSDictionary,用于保存标签,imageView和附件上的信息。标签和图像视图非常简单,但我用我的配件遇到了各种各样的障碍。
我的想法是在我的dataSource中包含一个返回UIView的块。像这样的东西
self.dataSource = @[
@{
@"label" : @"This is the Label",
@"icon" : @"icon_someIconName.png",
@"accessory" : (UIView*) ^ {
// code that returns the accessory for this row would go here
return nil; //
}
},
...
];
在tableView中:cellForRowAtIndexPath:
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// Configure the cell...
NSDictionary *cellDataSource = self.dataSource[indexPath.section][@"fields"][indexPath.row];
cell.textLabel.text = cellDataSource[@"label"];
[cell.imageView setImage:[UIImage imageNamed:cellDataSource[@"icon"]]];
// Accessory setup
UIView* (^accessoryBuilderBlock)(void) = cellDataSource[@"accessory"];
if (accessoryBuilderBlock) {
cell.accessoryView = accessoryBuilderBlock();
}
我的程序此时崩溃了。
有更有效的方法吗?我是Objective-C的新手,所以我没有全面掌握最佳实践。
我几乎肯定我在我的dataSet中使用块的方式不正确,特别是因为我读过某些地方,当插入到集合中时必须复制ARC块下。任何人都可以指出我这样做的正确方法(如果这是正确的)吗?
谢谢!
答案 0 :(得分:1)
问题肯定是你没有复制块,如果它是一个本地块,那么它将从当前范围中解除分配。所以试着复制它:
self.dataSource = @[
@{
@"label" : @"This is the Label",
@"icon" : @"icon_someIconName.png",
@"accessory" : [(UIView*)^ {
// code that returns the accessory for this row would go here
return nil; //
} copy]
},
...
];
答案 1 :(得分:0)
您可以创建一个类来保存表视图的数据源,而不是使用字典。这样,您可以使用您喜欢的任何自定义逻辑。像这样:
@interface MyClass : NSObject
@property (nonatomic, strong) NSString *label;
@property (nonatomic, strong) UIImage *icon;
- (UIView *)accessoryView; // Some method to return your accessoryView
@end
这将是一个更清洁(和OOP-ey)的解决方案。