0

所以我的情况很独特。我有一个包含一堆任务的待办事项列表应用程序。每个任务都有一个 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 来“隐藏”表的内容。” 但是,我不明白这意味着什么/如何实现它。

4

2 回答 2

1

您可以使用我们在旧数据库上使用的技术。您将 NSInteger 存储为类 var,并在创建它们时使用它为每个单元分配唯一的 id。创建每个单元格时,都会增加唯一 ID。像这样:

在您的界面中:

@property (nonatomic, assign) NSUInteger nextUniqueId;

然后在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

cell.tag = self.nextUniqueId++;

然后在您的视图控制器中跟踪这些标签。只需给他们一个可分配的属性,或自定义 init 以包含 id。

于 2013-08-15T05:55:34.553 回答
0

最好在索引路径方法中为单元格中的每一行设置标签值。全局存储该标签值,并在选择行方法中使用该标签。

于 2013-08-15T07:03:42.050 回答