关闭 Popover 后更新第一个视图
Posted
技术标签:
【中文标题】关闭 Popover 后更新第一个视图【英文标题】:Update the first view after dismissing Popover 【发布时间】:2017-03-08 00:58:52 【问题描述】:我从第一个视图控制器(tableview)到第二个视图控制器,它是一个 tableview。在我不使用第二个视图之后,我需要在第一个控制器中重新加载表视图。 如果我在弹出框外部点击,popoverPresentationControllerDidDismissPopover 会被调用,但是如果第二个 tableview 中有另一个按钮与第一个按钮相连怎么办? 通常我需要用户点击添加按钮来退出表格视图,而不是在弹出框之外点击。我将外部点击保留为取消操作。
谢谢
【问题讨论】:
【参考方案1】:当您以编程方式关闭委托方法 popoverPresentationControllerDidDismissPopover
时,它不会被调用。
解决方案是当您通过调用dismiss(animated:completion:)
关闭弹出框时,您也必须调用表格视图来重新加载数据。
所以基本上你打电话给tableView.reloadData()
两次。 popoverPresentationControllerDidDismissPopover
中的一个,dismiss(animated:completion:)
之后的一个,在您的添加按钮点击方法中。
更新
从您的屏幕截图中,我假设您的第一个视图控制器 (VC1) 是背景控制器,第二个视图控制器 (VC2) 是弹出窗口。
如果是这样,您有两个选择:
-
在 VC2 上,声明一个自定义协议来通知 VC1 重新加载表
选择行并在VC1中将委托设置为VC2时,查看数据。
您可以简单地在 VC2 中声明一个块属性,而不是使用协议。例如:
@property (copy, nonatomic) void (^itemSelectedHandler)()
;
当一个项目被选中时调用这个(仍然在 VC2 中):
self.itemSelectedHandler();
然后在 VC1 中,初始化 VC2(即弹出框)后,您将处理该块。例如:
vc2.itemSelectedHandler = ^
[vc1.tableView reloadData];
不幸的是,我没有快速编程的经验,所以我必须使用客观 c 代码作为示例。
【讨论】:
如果您知道如何快速实现块,则无需转换我的代码。我的代码仅用于说明目的。 不用担心。如果有帮助,您能接受我的回答吗?【参考方案2】:Swift 3.0 版本:
Popover VC:
定义一个属性:
var dismissHandler: (() -> Void)!
当 popover 被解除时调用这个处理程序:
self.dismissHandler()
父 VC:
在 Segue 的 prepare 方法中传递处理程序
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
...
destinationVC.dismissHandler =
self.tableView.reloadData()
...
【讨论】:
以上是关于关闭 Popover 后更新第一个视图的主要内容,如果未能解决你的问题,请参考以下文章