1

我有一个包含一堆任务的待办事项列表应用程序。每个任务都有一个 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 来“隐藏”表的内容。” 我还被建议使用标签。但是,我不明白如何实现这些。

编辑:---随机字符串---在tasks.m中

-(NSString *)uniqueIdentifierString{
    static NSString *alphabet  = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789";
    NSMutableString *s = [NSMutableString stringWithCapacity:20];
    for (NSUInteger i = 0U; i < 20; i++) {
        u_int32_t r = arc4random() % [alphabet length];
        unichar c = [alphabet characterAtIndex:r];
        [s appendFormat:@"%C", c];
    }
    return s;
}

在 tableviewcontroller.m

   -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    DetailViewController *detailVC;
     Tasks *task = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    if (![self.detailViewsDictionary.allKeys containsObject:task.uniqueIdentifierString]){
        detailVC = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];
        [self.detailViewsDictionary setObject:detailVC forKey:task.uniqueIdentifierString];
        detailVC.context = self.managedObjectContext;
    }else{
        detailVC = self.detailViewsDictionary[task.uniqueIdentifierString];
    }
        detailVC.testTask = task;
        [[self navigationController] pushViewController:detailVC animated:YES];
    NSLog(@"%@", detailVC);
    NSLog(@"%@", task.uniqueIdentifierString);
}
4

1 回答 1

2

一种解决方案是将您的 VC 从表格单元中分离出来。您可以将 VC 存储在由任务唯一的 ID 引用的字典中,但不必担心表格单元格。如果任务被移动或删除,您可以在其他地方处理,而不必担心 VC 阵列会立即出错。

您的另一个选择是将用于迭代 VC 数组的逻辑挂接到移动/编辑方法中以在那时调整数组。

鉴于UITableView期望单元被重用,您可以看到它并不意味着成为其他数据的存储机制。

最好将数据解耦,这样您就不会受到它们的顺序或存在的约束。

于 2013-08-16T21:37:21.970 回答