【问题标题】:Update the first view after dismissing Popover关闭 Popover 后更新第一个视图
【发布时间】:2017-03-08 00:58:52
【问题描述】:

我从第一个视图控制器(tableview)到第二个视图控制器,它是一个 tableview。在我不使用第二个视图之后,我需要在第一个控制器中重新加载表视图。 如果我在弹出框外部点击,popoverPresentationControllerDidDismissPopover 会被调用,但是如果第二个 tableview 中有另一个按钮与第一个按钮相连怎么办? 通常我需要用户点击添加按钮来退出表格视图,而不是在弹出框之外点击。我将外部点击保留为取消操作。

谢谢

【问题讨论】:

    标签: ios swift3


    【解决方案1】:

    当您以编程方式关闭委托方法 popoverPresentationControllerDidDismissPopover 时,它不会被调用。

    解决方案是当您通过调用dismiss(animated:completion:) 关闭弹出框时,您也必须调用表格视图来重新加载数据。

    所以基本上你打电话给tableView.reloadData() 两次。 popoverPresentationControllerDidDismissPopover 中的一个,dismiss(animated:completion:) 之后的一个,在您的添加按钮点击方法中。

    更新

    从您的屏幕截图中,我假设您的第一个视图控制器 (VC1) 是背景控制器,第二个视图控制器 (VC2) 是弹出窗口。

    如果是这样,您有两个选择:

    1. 在 VC2 上,声明一个自定义协议来通知 VC1 重新加载表 选择行并在VC1中将委托设置为VC2时,查看数据。
    2. 您可以简单地在 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()
        }
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多