我有一个带有大量任务的待办事项列表应用程序。每个任务都有一个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);
}
答案 0 :(得分:2)
一种解决方案是将VC与表格单元分离。您可以将VC存储在由任务唯一的ID引用的字典中,但不必担心表格单元格。如果移动或删除任务,您可以在其他地方处理,而不必担心VC阵列会立即出错。
你的另一个选择是挂钩移动/编辑方法迭代VC阵列的逻辑,以便在那时调整数组。
鉴于UITableView
期望重复使用单元格,您可以看到它不是其他数据的存储机制。
最好将数据解耦,这样你就不会受到它们的顺序或存在的束缚。