0

这件事让我生气了 5 天。我有我UITableView正在填充的NSMutableDictionary内容,其中包含从 Internet 提取的数据。一切都完美无缺。

我有检查新数据的功能,[NSURLRequest sendAsynchronousRequest...]如果有新数据,它实际上会返回一些数据。我精心设计了当有用的数据存在时,我将这些数据添加到我的字典[self.tableView reloadData];中并显示出来。它正在显示但是,这是问题所在。在我的 tableView 下是 textField 和一个允许用户发送消息的按钮。当用户点击文本字段时,键盘会出现(通常),并且我动画该 textField 移动到“向上”,按钮移动到“向上”并且 tableView 高度在键盘打开时可见。这也很好用,如果我在键盘上按回车键,键盘退出,所有的动画都会返回,仅此而已。

问题是,如果我的键盘打开,并且所有内容都向上移动并且 i reloadData,所有视图都会重置,这意味着 tableView 会返回到它的全高,按钮会返回向下,textField 会返回向下但键盘保持不变......为什么? 为什么视图会自行重置?

我也尝试过使用[self.tableView insertRowsAtIndexPaths...]不会产生这种效果的想法,但它会做同样的事情。为什么reloadDatainsertRowsAtIndexPaths(它们在插入新数据方面做得很好)弄乱了我的观点?

另外,如果我打印:

NSLog(@"Size Before: %f", self.tableView.frame.size.height);
[messages setObject:[newMessages objectForKey:key] forKey:date];
messagesKeys = [messages allKeys];
NSIndexPath *oNewIndexPath = [NSIndexPath indexPathForItem:[messagesKeys count] - 1 inSection:0];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:oNewIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];
NSLog(@"Size After: %f", self.tableView.frame.size.height);

更新前后我的表格视图的大小,它显示相同的缩小大小,但事实并非如此。TableView、按钮和 textField 正在被重置,看起来像在故事板中......

4

2 回答 2

0

尝试通过将其 frame.y 设置为负值而不是缩小 tableView 来将 tableView 移出屏幕。您不必以这种方式处理身高

于 2013-11-12T21:24:35.670 回答
0

为什么不只是添加一个 BOOL 变量,让我们将其调用isEditing到您的 UIViewController,它将在 - (void)textFieldDidBeginEditing:(UITextField *)textField方法中设置为 YES。如果同时需要重新加载数据(尽管这对我来说似乎是糟糕的设计),只需添加

if (isEditing) {
  [self.view endEditing:YES]; 
  isEditing = NO;
}

此方法查看当前视图及其子视图层次结构,以查找当前是第一响应者的文本字段。如果找到,它会要求该文本字段辞去第一响应者的职务。(引自文档)。所以基本上,我会做的是这样的:

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    isEditing = YES;
}

-(void) reloadData {
   //reload data
    if (isEditing) {
      [self.view endEditing:YES]; //or alternatively: [myTextField resignFirstResponder]
      isEditing = NO;
    }
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
    isEditing = NO;
}

[编辑] 关于你的原因关闭键盘虽然它通常会自动显示键盘,但系统不会自动关闭键盘。相反,您的应用有责任在适当的时候关闭键盘。

于 2013-11-12T21:18:02.857 回答