我有一个包含一堆任务的待办事项列表应用程序。每个任务都有一个 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);
}