【问题标题】:Why does reordering my tableView mess up my data?为什么重新排序我的 tableView 会弄乱我的数据?
【发布时间】:2011-04-24 19:33:54
【问题描述】:

我有两个不同的表视图,在其中我使用tableView:MoveRowAtIndexPath:ToIndexPath: 中完全相同的代码来支持用户对行重新排序。这些 tableViews 之一完美地工作。然而,另一个变得混乱并开始显示相同的子视图,无论选择哪一行 - 即它的行索引似乎已经搞砸了。

我通过在MoveRowAtIndexPath 方法的末尾添加[tableView reloadData] 暂时解决了这个问题,但我不明白为什么它一开始就不起作用 - 特别是因为另一个视图完全相同代码完美运行。显然,这个视图控制器中肯定有另一个方法搞砸了,但我不知道在哪里看。

以下是两者相同的代码:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {  
    userDrivenDataModelChange = YES;

    NSMutableArray *things = [[fetchedResultsController fetchedObjects] mutableCopy];   
    NSManagedObject *thing = [[self fetchedResultsController] objectAtIndexPath:fromIndexPath];   
    [things removeObject:thing];
    [things insertObject:thing atIndex:[toIndexPath row]];

    int i = 0;
    for (NSManagedObject *mo in things)
    {
        [mo setValue:[NSNumber numberWithInt:i++] forKey:@"displayOrder"];
    }

    [things release], things = nil;

    [managedObjectContext save:nil];
    userDrivenDataModelChange = NO;
}

(值得一提的是,有效的是无效的子视图,并且它们处于一对多的核心数据关系中)。

【问题讨论】:

    标签: iphone cocoa-touch uitableview core-data


    【解决方案1】:

    为每个表视图使用不同的标识符

    • (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier

    如果使用相同的标识符字符串,它们将拾取彼此缓存的单元格对象并显示不一致的数据。

    【讨论】:

    • 恐怕没什么区别。混淆不是发生在不同的表格视图之间,而是发生在一个表格视图中的行之间 - 在手动移动行之后,突然点击任何行与点击顶行相同。
    【解决方案2】:

    我忘记了我在父视图上使用了自定义单元格,并且用户按下了单元格内的 UIButton,而不是单元格本身。自定义单元格的索引路径由tableView:cellForRowAtIndexPath: 设置为属性,当然在移动表格单元格后不会再次调用它。因此,我必须添加一个[tableView reloadData] 以确保单元格得到更新。

    【讨论】:

      猜你喜欢
      • 2015-12-13
      • 1970-01-01
      • 2012-01-23
      • 2020-08-17
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多