从子视图调用父视图控制器函数

Calling parent View Controller function from a subview

我有一个带有两个子视图控制器的父 ViewController。

当我加载父视图控制器时,它将显示两个子视图。我还可以向左或向右滑动以滑动子视图。我现在需要在子视图上添加一个按钮。单击按钮时,它应该会自动滑动到下一个子视图。

这就是我的计划 - 在子视图上放置一个按钮 viewcontroller。点击按钮将调用父 viewcontroller 中负责滑动的函数。现在我无法调用父 viewcontroller 的函数。我需要父视图控制器的当前实例。 有人可以帮忙吗?

图片上,灰色为子视图viewcontroller1 绿色是子视图 viewcontroller 2。 单击 viewcontroller1 的按钮应滑动到 viewcontroller 2

Please click here for screen print

我想到了两个解决方案:

  1. 让你的按钮成为父视图控制器的子视图;如果您希望按钮成为子视图控制器视图之一的子视图,这显然不起作用。
  2. 要扩展@NazmulHasan 的建议,您可以为您的子视图控制器实施自定义协议。以子视图控制器 1 为例,您只需要为它声明一个委托协议 class。这告诉编译器视图控制器的委托必须实现哪些功能才能满足协议。所以你会做这样的事情:
    protocol childViewControllerOneDelegate {
        func buttonWasPressed(sender: UIButton) -> Void
    }

您还需要添加一个 属性 到您的子视图控制器,如下所示:

var myDelegate : childViewControllerOneDelegate!

它是一个隐式解包的可选项,因为在 class 初始化时你不能设置委托;你按照我将在下面概述的方式进行设置。

在父视图控制器 class 声明的最顶部,然后声明视图控制器符合此协议:

class parentViewController : UIViewController, childViewControllerOneDelegate ... Etc, etc {

当您从父视图控制器初始化 childViewControllerOne 时,您可以在之后直接添加一行内容:

myChildViewControllerOne.delegate = self

最后,回到您的按钮和子视图控制器,您只需向其添加一个调用以下内容的操作:

self.myDelegate.buttonWasPressed(self.button)

这将触发父视图控制器中的方法,您可以做任何您需要做的事情。

希望对您有所帮助。与这些答案一样,我试图将大量信息压缩到一个小 space 中,所以如果您有任何问题,请给我留言。祝一切顺利!

您可以使用交叉引用。初始化后,您必须将父项 viewController 的弱引用传递给子项。