如何在呈现的模式 vc 被关闭后立即在 VC 中重新加载 UITableView?

How can I reload a UITableView in a VC as soon as the presented modal vc is dismissed?

我在 Swift 2 工作,有一个 Master-Detail-Template。详细视图控制器包含一个 table 视图,其中可以在模态视图上添加元素,由详细视图控制器呈现(使用 核心数据 )。我尝试使用一个集成到详细视图控制器中的委托,它告诉它在关闭模态视图时重新加载 table 视图的数据,但它不会重新加载数据,直到我 select Master-Detail-Template 的主视图中的另一个元素。这是 newSittingVC:

中的代表
protocol newSittingVCDelegate {
    func saveReload()
}

当用户想要关闭模态视图时,调用这段代码:

self.delegate!.saveReload()
presentingViewController!.dismissViewControllerAnimated(true, completion: nil)

在详细视图中调用它 VC:

func saveReload() {
    sittingTable.reloadData()
    //self.view.setNeedsDisplay()
}

不是我描述的那样。有谁知道可行的方法。即使使用 setNeedsDisplay() 强制重绘视图也不起作用。

编辑:

阅读我的 ,其中我描述了您必须将后备存储与 UITableView 同步。你遇到了非常相似的问题。

在您的回调中,您只是在调用 sittingTable.reloadData()。它能做什么?它调用所有这些 UITableViewDataSource 委托方法,例如 numberOfSections...,... 以及 tableView(_:cellForRowAtIndexPath:)。这些方法有什么作用?它们 return 值基于您的 sitzungen 数组 (count, ...)。您现在可能知道问题出在哪里 - 您是否更新了 sitzungen 数组?不,你没有。

因此,在您的 saveReload() 方法中,您必须再次执行获取请求(与您在 setupSittingTable 中执行的方式相同)并且当您的 sitzungen 数组更新时,然后(很快)打电话给 sittingTable.reloadData()。这应该可以解决您的问题。


还有一点...

不要以这种方式调用您的委托方法...

self.delegate!.saveReload()

...将其更改为...

self.delegate?.saveReload()

...有什么区别?我假设您的委托是可选的 (?),当未设置委托 (nil) 时,它将崩溃。因为 ! 是可选的强制展开,如果它是 nil,它就会崩溃。如果将 ! 替换为 ?,它会执行以下操作:

  • 如果 self.delegate != nil - saveReload() 被调用,
  • if self.delegate == nil - 没有任何反应,也没有崩溃。

您可以在 Optional Chaining 章节中了解更多信息,尤其是 Calling Methods Through Optional Chaining

不要使用 sittingCell 作为 class 名称。 Class name, types, ... 应该以大写字母开头(驼峰式)。所以正确的 class 名称是 SittingCell。第一个小写字母用于函数名称,属性 名称,...

此外,下次请不要使用图片,最好将问题中的代码复制并粘贴并正确格式化为文本。很难读,...