关闭 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 后更新第一个视图的主要内容,如果未能解决你的问题,请参考以下文章

在 iPad 的同一视图中加载多个 popOver

Swift 3 Popover 昏暗背景

如何设置 Popover 视图以正确关闭

从 Popover 关闭或弹出到根视图控制器

如何从 Popover 调用主视图控制器的方法?

从popover返回后如何在collectionview单元格中填充文本字段