在其中一个单元格中编辑UITextField时,可以动态重新加载UITable

时间:2011-11-21 22:34:03

标签: iphone cocoa-touch uitableview uitextfield

我有一个UITable包含一些海关UITableCells。这些单元格包含一些UILabel和一个UITextField。该表的数据源来自主控制器的属性。 (此控制器也是表的委托和dataSource。)

以下是UI的简化屏幕截图:

schreenshot

现在,当用户编辑其中一个UITextField时,我需要“动态”更新所有UILabel的内容。 为此,我正在收听UITextField级别的“编辑已更改”事件。这会触发以下操作:

- (IBAction) editChangeHandler: (id) sender {
    MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    [[delegate.viewController.myDataSourceArray objectAtIndex:self.rowIndex] setANumber: [theTextField.text intValue]];
    [delegate.viewController reloadRows];
}

viewController中的reloadRows方法是这样的:

- (void) reloadRows {
    NSLog(@"called reloadRows");
    //perform some calculations on the data source objects here...
    [theUITable reloadData];
}

我的问题是,每当用户更改字段中的值时,都会成功调用reloadRows方法,因此显然是reloadData,但它也会导致键盘被解除。

所以最后,用户只能在键盘解除并重新加载表格之前编辑TextField时触摸一个键。

有人知道解决方案或遇到过同样的问题吗?

2 个答案:

答案 0 :(得分:3)

您可以根据需要有选择地修改行,而不是更新整个表(这样做是为了更新您当前正在使用的单元格,重置其状态)。

看看:

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

此外,您可以通过以下方式直接编辑这些单元格:

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath

如果您不想重建这些单元格。

答案 1 :(得分:3)

我遇到了同样的问题。在我的情况下,我试图创建一个通用控制器,因此编写一个特定的方法来手动重建单元格不是一个好的选择。

以下是我提出的解决方案:

  1. 暂时使表格中某个其他单元格中的文本字段成为第一个响应者。
  2. 调用reloadRowsAtIndexPaths重新加载用户正在编辑的单元格。
  3. 让用户正在编辑的字段再次成为第一响应者。
  4. 它就像一个魅力。键盘保持可见,完全没有闪烁,单元格得到正确刷新,用户可以继续键入他们最初编辑的相同字段。