UITableViewCell UITableView中的不同配件?

时间:2013-09-30 22:26:34

标签: objective-c uitableview

我正在为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();
}

我的程序此时崩溃了。

  1. 有更有效的方法吗?我是Objective-C的新手,所以我没有全面掌握最佳实践。

  2. 我几乎肯定我在我的dataSet中使用块的方式不正确,特别是因为我读过某些地方,当插入到集合中时必须复制ARC块下。任何人都可以指出我这样做的正确方法(如果这是正确的)吗?

  3. 谢谢!

2 个答案:

答案 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)的解决方案。