【问题标题】:Calling parent View Controller function from a subview从子视图调用父视图控制器函数
【发布时间】:2016-09-13 20:27:15
【问题描述】:

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

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

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

在图片上,灰色是subview viewcontroller 1 绿色是子视图视图控制器 2。 点击 viewcontroller1 的按钮应该会滑动到 viewcontroller 2

Please click here for screen print

【问题讨论】:

  • 你在尝试什么?请分享代码。有什么错误吗?如果有,那是什么?
  • @NazmulHasan - 三个视图控制器 - VC1、VC2 和 VC3。 VC1 是父视图,VC2、VC3 是子视图。 VC1 将 VC2 和 VC3 显示为可以向左或向右滑动的卡片样式(此部分正在工作)。我想在 VC2 上有一个按钮,这样在点击时,它会自动滑到 VC3
  • 可能是!你可以通过协议来完成
  • @NazmulHasan - 我是新手.. 你能提供更多细节吗?如果您想看一下,我已在问题中添加了屏幕打印。

标签: ios swift viewcontroller subview


【解决方案1】:

我能想到两种解决方案:

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

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

var myDelegate : childViewControllerOneDelegate!

这是一个隐式展开的可选选项,因为你不能在类初始化时设置委托;你设置它,我将在下面概述。

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

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

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

myChildViewControllerOne.delegate = self

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

self.myDelegate.buttonWasPressed(self.button)

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多