将数据从 UITableViewCell 传递到 UITableViewController 的方法
我正在找出将数据从 UITableViewCell
传递到 UIableViewController
(或 UIViewController
)的正确机制。
在 stackoverflow 中搜索时,我发现了不同的方法来做到这一点,最后我找到了一种运行良好的机制,但我不知道它是否是一种有效的方法。
这就是场景。首先,我创建了一个名为 DataTableViewCell
的自定义单元格(与 xib 接口关联),它扩展了 UITableViewCell
。该单元格有一些显示(和修改)数据的出口,以及一个称为索引的令人上瘾的属性,如下所示:
@property (nonatomic, copy) NSIndexPath* index;
属性在 UITableViewController
内的 cellForRowAtIndexPath
方法内刷新:
- (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;
UITableViewController
实现该协议。通过这种方式,在单元内(针对某些事件),我可以调用该方法并以正确的方式更新模型。
话虽如此,我有一些问题要问:
- 这是将数据从单元传递到控制器的正确机制吗?
- 使用像单元格中使用的索引属性是否正确?
- 使用保留策略而不是复制策略是一样的吗?有什么区别?
- 由于我找到的解决方案可能非常诡计多端,是否可以使用 block 来代替?
关于块,我是这样想的:
在单元格内创建一个如下所示的属性块:
@property (nonatomic, copy) void (^updateModelOnEvent)(DataItem* dataItem);
然后在UITableViewController
内的cellForRowAtIndexPath
方法内将该属性分配给一个块代码,如下所示this(此代码与 cell.index = indexPath;
处于同一级别):
// configure the cell with the current indexPath
cell.updateModelOnEvent = ^(DataItem* dataItem) {
[self.model insertObject:dataItem atIndex:indexPath.row];
};
可能是有效的替代方案吗?在这种情况下,我是否必须使用复制或保留策略?
先感谢您。
I'm figuring out the right mechanism to pass data from UITableViewCell
s to a UIableViewController
(or UIViewController
).
Searching within stackoverflow I found different ways to do this and finally I found a mechanism that works well but I don't know if it could be a valid approach.
This is the scenario. First, I created a custom cell (associated with a xib interface), named DataTableViewCell
, that extends UITableViewCell
. This cell has some outlet to display (and modify) data and an addictional property called index like the following:
@property (nonatomic, copy) NSIndexPath* index;
This property is refreshed inside the method cellForRowAtIndexPath
method within the 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;
}
Since it is possible to change values within a cell, I had the need to pass data to the UITableViewController
for updating the model. To do that I decided to use a delegate mechanism. So, I created a protocol with a method like the following:
- (void)updateData:(DataItem*)dataItem atIndexPath:(NSIndexPath*)index;
The UITableViewController
implements that protocol. In this way, within the cell (against to some events), I can call that method and update the model in the correct way.
Having said this, I have some questions to ask:
- Is this a right mechanism to pass data from a cell to a controller?
- Is it correct to using an index property like the one use in the cell?
- Is it the same using retain policy instead of copy policy. What could be the difference?
- Since the solution I found could be very scheming, is it possible to use block insteads?
About blocks, I thought this way:
Within the cell create a property block like the following:
@property (nonatomic, copy) void (^updateModelOnEvent)(DataItem* dataItem);
Then inside the method cellForRowAtIndexPath
method within the UITableViewController
assign that property to a block code like this (this code is at the same level of cell.index = indexPath;
):
// configure the cell with the current indexPath
cell.updateModelOnEvent = ^(DataItem* dataItem) {
[self.model insertObject:dataItem atIndex:indexPath.row];
};
Could be a valid alternative? In this case, do I have to use copy or retain policy?
Thank you in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
为什么不直接将
[UITableView indexPathForCell:]
与委托一起使用?MyViewController.h
MyViewController.m
MyTableViewCell.h
MyTableViewCell.m
Why not just use
[UITableView indexPathForCell:]
with a delegate?MyViewController.h
MyViewController.m
MyTableViewCell.h
MyTableViewCell.m