从子视图调用父视图控制器函数
Calling parent View Controller function from a subview
我有一个带有两个子视图控制器的父 ViewController。
当我加载父视图控制器时,它将显示两个子视图。我还可以向左或向右滑动以滑动子视图。我现在需要在子视图上添加一个按钮。单击按钮时,它应该会自动滑动到下一个子视图。
这就是我的计划 - 在子视图上放置一个按钮 viewcontroller。点击按钮将调用父 viewcontroller 中负责滑动的函数。现在我无法调用父 viewcontroller 的函数。我需要父视图控制器的当前实例。
有人可以帮忙吗?
图片上,灰色为子视图viewcontroller1
绿色是子视图 viewcontroller 2。
单击 viewcontroller1 的按钮应滑动到 viewcontroller 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 的弱引用传递给子项。
我有一个带有两个子视图控制器的父 ViewController。
当我加载父视图控制器时,它将显示两个子视图。我还可以向左或向右滑动以滑动子视图。我现在需要在子视图上添加一个按钮。单击按钮时,它应该会自动滑动到下一个子视图。
这就是我的计划 - 在子视图上放置一个按钮 viewcontroller。点击按钮将调用父 viewcontroller 中负责滑动的函数。现在我无法调用父 viewcontroller 的函数。我需要父视图控制器的当前实例。 有人可以帮忙吗?
图片上,灰色为子视图viewcontroller1 绿色是子视图 viewcontroller 2。 单击 viewcontroller1 的按钮应滑动到 viewcontroller 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 的弱引用传递给子项。