【问题标题】:iOS UITableView no longer calls delegate after modal dismissediOS UITableView 在模态解除后不再调用委托
【发布时间】:2016-02-10 14:52:55
【问题描述】:

我有一个 UITableViewController 可以正常工作,但以下情况除外。

我创建并展示了一个模态视图控制器,如下所示:

[self.tableView beginUpdates];
NSMutableDictionary *request_params = [NSMutableDictionary new];
InputViewController *inputController = [[InputViewController alloc] initWithParams:request_params 
    continuation:^(UIViewController * thisInputController) {  
      [self complete:request_params success:^() {  
        [self.navigationController dismissViewControllerAnimated:YES completion:nil];  
        [self.tableView endUpdates]; # Added in 
      } failure:nil];  
    } cancel:^{  
      [self.navigationController dismissViewControllerAnimated:YES completion:nil];  
    }];  
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:inputController];  
[self.navigationController presentViewController:nav animated:YES completion:nil]; 

当用户按下“完成”(rightBarButtonItem) 时 InputViewController 调用 continuation,当用户按下“取消”(leftBarButtonItem) 时取消。

complete 进行网络异步调用,并在请求完成时调用成功块。

在快乐的道路上(即调用延续块),一切都很好。但是,当模式对话框在取消块中被关闭时,TableView 会被完全淹没。滚动有效,但只有已经可见的单元格存在。滚动会导致一个空的 UI。委托和数据源似乎设置正确,但似乎根本没有被调用。

Before ScrollAfter scroll

我尝试了多种方法,包括改用委托,在主线程中显式调用关闭等。我现在不知道该尝试什么。

非常感谢任何关于我缺少什么的线索,甚至是关于下一步要尝试什么的指针。

见过

这两种情况似乎都是数据与视图不同步的情况, 但是这两种情况都不适用,因为如果我采用快乐的路径(表格中的数据确实会发生变化)并且在取消路径中,我根本不会触及数据。

[更新]:另外,我的行操作不再起作用。在幸福的道路上和之前,一切都很好。取消后,不再进行编辑操作:-(

[更新]:添加了缺少的 beginUpdatesendUpdates 调用,用于识别问题。

【问题讨论】:

  • 我的猜测是它与 NSURL 委托或模态视图控制器关闭没有太大关系;它在您代码中的其他位置。您应该在设置、呈现和维护不起作用的 tableView 的位置添加代码,因为这就是问题所在。
  • @Alex,感谢您的想法。但是,我非常怀疑这一点(我承认我肯定是错的)。这是因为在快乐的路径中(表的数据源中的数据确实发生了变化),它就像一个魅力。只有当我简单地取消模态控制器时它才会失败。另外,我已经编辑了问题,以添加其他信息。
  • @Alex,我认为这不是问题的另一个原因是,我已在所有委托和数据源方法中添加了日志和断点。他们甚至都没有被调用。
  • 我可以肯定地告诉你,当你在它们之上展示一个模态视图控制器或发出 NSURL 请求时,tableView 不会中断。您的“快乐路径”如何与中断的 tableView 交互?
  • @Alex,你的评论让我重新审视我的代码,看看为什么我的快乐路径有效,我的取消路径在哪里不同.. 并找到了答案(见下文)。所以,谢谢你:)

标签: ios objective-c uitableview modalviewcontroller


【解决方案1】:

@Alex 是正确的。当您从其顶部关闭模态视图时,tableView 不会中断。

但是,当您 beginUpdates 并且 忘记endUpdates 时,它们的行为确实很奇怪。事实证明,取消时,dismissViewController 被调用,但 endUpdates 没有。

确保您的 beginUpdatesendUpdates 匹配,否则 tableView 的行为会非常奇怪。

【讨论】:

  • 这救了我的命。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
相关资源
最近更新 更多