所以我的情况非常独特。我有一个待办事项列表应用程序与一堆任务。每个任务都有一个UITableViewCell。在点击每个表视图单元格之后,它会创建一个视图控制器,其任务位于该行的索引路径属性中。这些视图控制器都存储在NSDictionary中。这是我刚才所说的代码表示:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
DetailViewController *detailVC;
if (![self.detailViewsDictionary.allKeys containsObject:indexPath]){
detailVC = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];
[self.detailViewsDictionary setObject:detailVC forKey:indexPath];
detailVC.context = self.managedObjectContext;
}else{
detailVC = self.detailViewsDictionary[indexPath];
}
Tasks *task = [[self fetchedResultsController] objectAtIndexPath:indexPath];
detailVC.testTask = task;
[[self navigationController] pushViewController:detailVC animated:YES];
NSLog(@"%@", self.detailViewsDictionary);
}
因此,这种创建独特视图控制器并使用某个键存储它们的方法几乎总是有效。删除或移动视图控制器时出现问题:
我的印象是,当您向下滚动(出列)时,单元格的索引路径会被回收。这是否意味着用数字标识符标记每个单元格会导致同一标识符的多个单元格?
另外,如果使用indexPath键存储每个视图控制器,如何确保该键未设置为两个视图控制器..?例如。假设您有4个单元格,这意味着有4个视图控制器。删除单元格3.单元格4向下移动到单元格3s点。您创建一个新的单元格,它将转到第4位。现在您有两个具有相同indexPath键的控制器!你怎么避免这个?它正在搞砸我的应用程序,因为已经移动的任务正在错误的视图控制器/单元格中加载它们的属性!
之前有人建议我解决这个问题:“你维护一个NSMutableArray,它”遮蔽“表格的内容。”但是,我不明白这意味着什么/如何实现它。
答案 0 :(得分:1)
您可以使用我们过去在旧数据库上使用的技术。您将NSInteger存储为类var,并在创建它们时使用它为每个单元格分配唯一的ID。在创建每个单元格时,您将增加唯一ID。像这样:
在您的界面中:
@property (nonatomic, assign) NSUInteger nextUniqueId;
然后在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
cell.tag = self.nextUniqueId++;
然后在viewControllers中跟踪这些标记。只需给它们一个可赋值的属性,或者自定义init以包含id。
答案 1 :(得分:0)
最好为索引路径方法中的行设置单元格中每一行的标记值。全局存储该标记值,并在选择行方法中使用该标记。