前几天我看到了这篇博文,从逻辑上讲,我根本不知道如何实现它。
有任何想法吗?
我在想它涉及核心数据,“权力”是一对多关系中的另一个实体,除此之外,我迷路了。
如果要实现视图层次结构,只需从导航项目开始。Superhero tableview 控制器是你的根控制器,powers tableview 是一个子控制器。
在您的核心数据模型中,您将有两个实体,一个超级英雄实体和一个权力实体。每个超级英雄实体都会有一个名称,然后是与权力实体的一对多关系。权力实体将具有一个名称,并且(可选地)与所有拥有权力的超级英雄实体具有互惠关系。(不是真的需要,但在这种情况下,但很好的做法。)
superhero tableview 数据源将对所有超级英雄实体进行获取,然后使用每个超级英雄的名称填充每个单元格的文本。当用户点击一个英雄时,超级英雄表格视图会告诉导航控制器将力量表格视图推送到堆栈上,并将选定的超级英雄实体交给力量表格视图数据源。然后,power tableview 数据源将使用与超级英雄实体的关系中的权力填充该表。它还将根据需要创建权力实体并将它们添加到关系中。
如果您使用的数据量很小,则不需要为此使用核心数据。您可以创建一个字典,其中每个键都是超级英雄的名字,每个值都是一个权力名称数组。superhero tableview 数据源将填充键,powers tableview 数据源将填充值数组中的各个元素。
我建议你从UINavigationController开始。
您可以使用 NSMutableSet 支持检查和取消选中“功率”单元格以跟踪所选功率。无论您使用 Core Data 还是其他方法向 UITableView 提供 powers 数据,这都有效。
例如,在表的数据源实现中:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// do usual stuff here including getting the cell
// determine the power from the IndexPath.row
if ([selectedPowerSet member:power])
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
return cell;
}
并在表的委托(通常是同一个类)实现中:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// determine the power from the IndexPath.row
if ([selectedPowerSet member:power]) {
[selectedPowerSet removeObject:power];
} else {
[selectedPowerSet addObject:power];
}
[tableView reloadData];
}