这件事现在小便了我5天了。
我的UITableView
正在填充NSMutableDictionary
,其中包含从互联网上提取的数据。一切都很完美。
我有一个函数来检查实际上[NSURLRequest sendAsynchronousRequest...]
的新数据,如果有新的东西,它会返回一些数据。我精心设计了当有用数据存在时,我将该数据添加到我的字典中并[self.tableView reloadData];
显示该数据。它正在显示,但这是问题所在。
在我的tableView下是textField和一个允许用户发送消息的按钮。当用户点击文本字段时,键盘出现(正常),我动画显示textField移动到“up”,按钮移动到“up”,tableView高度在键盘打开时可见。这也行得很好,如果我按下键盘上的返回键盘,键盘会停止,一切都会动画回来,就是这样。
问题是,如果我的键盘处于打开状态,并且所有内容都移动到了reloadData
,则所有视图都会重置,这意味着,tableView会返回到它的全高,按钮会返回,textField会返回向下但键盘停留...为什么?为什么视图会自行重置?
我也尝试使用[self.tableView insertRowsAtIndexPaths...]
思考不会产生这种效果,但它做同样的事情。为什么reloadData
和insertRowsAtIndexPaths
(它们在插入新数据时工作得很好)搞砸了我的观点?
如果我打印:
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,button和textField正在被重置,看起来像在故事板中......
答案 0 :(得分:0)
为什么不添加一个BOOL变量,让我们将它称为isEditing
到你的UIViewController,它将被设置为YES
- (void)textFieldDidBeginEditing:(UITextField *)textField
方法。如果有必要在此期间重新加载数据(虽然这对我来说似乎是糟糕的设计),只需添加
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;
}
[编辑]关于为什么部分: 解雇键盘 虽然它通常会自动显示键盘,但系统不会自动关闭键盘。相反,应用程序有责任在适当的时候关闭键盘。
答案 1 :(得分:0)
尝试通过将frame.y设置为负值而不是缩小tableView来将tableView移动到屏幕外。你不必以这种方式处理身高