我有一个UITable包含一些海关UITableCells。这些单元格包含一些UILabel和一个UITextField。该表的数据源来自主控制器的属性。 (此控制器也是表的委托和dataSource。)
以下是UI的简化屏幕截图:
现在,当用户编辑其中一个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时触摸一个键。
有人知道解决方案或遇到过同样的问题吗?
答案 0 :(得分:3)
您可以根据需要有选择地修改行,而不是更新整个表(这样做是为了更新您当前正在使用的单元格,重置其状态)。
看看:
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
此外,您可以通过以下方式直接编辑这些单元格:
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
如果您不想重建这些单元格。
答案 1 :(得分:3)
我遇到了同样的问题。在我的情况下,我试图创建一个通用控制器,因此编写一个特定的方法来手动重建单元格不是一个好的选择。
以下是我提出的解决方案:
它就像一个魅力。键盘保持可见,完全没有闪烁,单元格得到正确刷新,用户可以继续键入他们最初编辑的相同字段。