如何在呈现的模式 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
。第一个小写字母用于函数名称,属性 名称,...
此外,下次请不要使用图片,最好将问题中的代码复制并粘贴并正确格式化为文本。很难读,...
我在 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
。第一个小写字母用于函数名称,属性 名称,...
此外,下次请不要使用图片,最好将问题中的代码复制并粘贴并正确格式化为文本。很难读,...