移动行后更新UITableViewCell标记属性

时间:2012-01-03 05:17:03

标签: iphone ios uitableview tags

在我的应用程序中,当我在textFieldDidEndEditing:中提交编辑更改时,我需要能够跟踪识别UITextField来自哪个单元格。为此,我只在tableview:cellForRowAtIndexPath:的单元格文本字段中设置tag属性。

当细胞移动时,这会引起一些麻烦。例如,如果我将底部单元格移动到顶部,删除现在位于底部的单元格,然后尝试编辑我刚放在顶部的单元格,我的应用程序将崩溃,因为标记属性仍然是8 (或其他数字),但我的数据源中没有这么多元素。

我尝试通过更新tableView:moveRowAtIndexPath:toIndexPath:

中的标记来解决此问题
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
    NSString *siteToMove = [[sites objectAtIndex:[fromIndexPath row]] retain];

    [sites removeObjectAtIndex:[fromIndexPath row]];
    [sites insertObject:siteToMove atIndex:[toIndexPath row]];

    if ([toIndexPath section] == 1) {
        [[(BookmarkTextEntryTableViewCell *)[[self tableView] cellForRowAtIndexPath:toIndexPath] textField] setTag:[toIndexPath row]];
    }
}

但是,这不起作用,因为(BookmarkTextEntryTableViewCell *)[[self tableView] cellForRowAtIndexPath:toIndexPath]会在移动行之前返回那里的单元格。

1 个答案:

答案 0 :(得分:1)

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath方法中,您可以将您可能已添加为子视图的所有UITextField遍历到表中,然后检查并将新标记设置为 -

for (UIView* subview in [[self tableView] subviews]) {
 if ([subview isKindOfClass:[UITextField class]]) {  
  if(subview.tag==oldTag){
    subview.tag = newTag;
    break;
  }
 }
}

编辑:第二个想法,你可以重新加载表数据,以防重置所有剩余单元格的标签。