1

我正在为 UITableView 中的单元格编写不同的附件。

我需要根据行指定它们。

为此,我编写了一个 dataSource NSDictionary 来保存关于标签、imageView 和附件的信息。Label 和 imageView 非常简单,但我的配件遇到了各种各样的障碍。

我的想法是在我的数据源中包含一个返回 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 下的块在插入集合时必须被复制。谁能指出我这样做的正确方法(如果这是正确的)?

谢谢!

4

2 回答 2

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]
    },
    ... 
];
于 2013-09-30T22:38:25.003 回答
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)的解决方案。

于 2013-10-01T15:24:42.353 回答