我正在找出传递数据的正确机制UITableViewCell
s to a UIableViewController
(or UIViewController
).
在 stackoverflow 中搜索时,我发现了不同的方法来做到这一点,最后我找到了一种运行良好的机制,但我不知道它是否是一种有效的方法。
这就是场景。首先,我创建了一个自定义单元(与 xib 接口关联),名为DataTableViewCell
,延伸UITableViewCell
。该单元格有一些显示(和修改)数据的出口和一个称为索引的附加属性,如下所示:
@property (nonatomic, copy) NSIndexPath* index;
该属性在方法内部刷新cellForRowAtIndexPath
内的方法UITableViewController
:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
DataTableViewCell *cell = (DataTableViewCell*)[tv dequeueReusableCellWithIdentifier:kCellTableIdentifier];
if (cell == nil)
{
[[NSBundle mainBundle] loadNibNamed:@"DataTableViewCell" owner:self options:nil];
cell = (DataTableViewCell*)self.dataTableViewCellOutlet;
}
// configure the cell with data
// do stuff here...
// configure the cell with the current indexPath
cell.index = indexPath;
return cell;
}
由于可以更改单元格内的值,因此我需要将数据传递到UITableViewController
用于更新模型。为此,我决定使用委托机制。因此,我使用如下方法创建了一个协议:
- (void)updateData:(DataItem*)dataItem atIndexPath:(NSIndexPath*)index;
The UITableViewController
实现该协议。通过这种方式,在单元内(针对某些事件),我可以调用该方法并以正确的方式更新模型。
说了这么多,我有几个问题想问:
- 这是将数据从单元传递到控制器的正确机制吗?
- 使用像单元格中使用的索引属性是否正确?
- 使用保留策略而不是复制策略是一样的吗?有什么区别?
- 由于我发现的解决方案可能非常诡计多端,是否可以使用 block 来代替?
关于块,我是这样想的:
在单元格内创建一个属性块,如下所示:
@property (nonatomic, copy) void (^updateModelOnEvent)(DataItem* dataItem);
然后在方法内部cellForRowAtIndexPath
内的方法UITableViewController
将该属性分配给像这样的块代码(该代码与cell.index = indexPath;
):
// configure the cell with the current indexPath
cell.updateModelOnEvent = ^(DataItem* dataItem) {
[self.model insertObject:dataItem atIndex:indexPath.row];
};
可能是一个有效的替代方案吗?在这种情况下,我是否必须使用复制或保留策略?
先感谢您。