繁体   English   中英

iOS UITableView insertRowsAtIndexPaths reloadData

[英]iOS UITableView insertRowsAtIndexPaths reloadData

这东西让我生气了5天了。 我的UITableView是从NSMutableDictionary填充的,其中包含从Internet提取的数据。 一切正常。

我有检查新数据的功能,该功能实际上是[NSURLRequest sendAsynchronousRequest...] ,如果有新内容,它会返回一些数据。 我精心制作了有用的数据,然后将其添加到字典和[self.tableView reloadData]; 显示出来。 但是正在显示,这是问题所在。 在我的tableView下面是textField和一个允许用户发送消息的按钮。 当用户点击文本字段时,键盘会出现(正常情况下),并且我会为textField设置动画,使textField移至“ up”,按钮移至“ up”,tableView的高度在打开键盘时可见。 如果我按键盘上的return键,键盘也辞职,一切都会动画回落,仅此而已。

问题是,如果我的键盘打开了,并且所有东西都移到了上面,我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正在重设,看起来像故事板一样。

为什么不只是添加一个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;
}

[编辑]关于您的原因消除键盘尽管通常会自动显示键盘,但系统不会自动消除键盘。 相反,您的应用有责任在适当的时间关闭键盘。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM