【问题标题】:Switching containerView content from within viewController从 viewController 中切换 containerView 内容
【发布时间】:2018-01-14 17:47:33
【问题描述】:

我有三个视图控制器MainABMain ViewController 包含 ContainerView 和其他内容,以及 containerView 中的所有事务。 ViewControllerAButtonA 按下时容器的内容必须更改为 ViewControllerB 我怎样才能做到这一点?我找不到任何类似的例子。

【问题讨论】:

    标签: ios objective-c uiviewcontroller uicontainerview


    【解决方案1】:

    您需要为此创建创建委托。 首先创建一个协议

    protocol ViewControllerADelagate {
        func didPressOnButtonA()
    }
    

    在 ViewControllerA 中添加以下委托变量

    class ViewControllerA {
        ....
    
        var delegate : ViewControllerADelagate?
        ....
    }
    

    在 ViewControllerA 中按下按钮添加以下内容

    @IBAction buttonAPressed(sender : UIButton) {
        self.delegate?.didPressOnButtonA()
    }
    

    在 MainViewController 中将 ViewControllerA 的委托分配给 self 喜欢

    vcA.delegate = self
    

    在MainViewController中实现委托方法

    func didPressOnButtonA {
            let storyboard : UIStoryboard = UIStoryboard(name: storyboard, bundle: nil)
            let vcB : UIViewController = storyboard.instantiateViewController(withIdentifier: viewControllerIdentifier) as! ViewControllerB
            self.addChildViewController(vcB)
            self.containerView.addSubview(vcB.view)
            vcB.didMove(toParentViewController: self)
            vcB.view.frame = CGRect.init(x: 0, y: 0, width: self.containerView.frame.size.width, height: self.containerView.frame.size.height)
    }
    

    【讨论】:

      【解决方案2】:

      在单击按钮 A 时。向 mainView 发布通知。从 Container 中移除 viewController A 并添加 View Controller B 。

      【讨论】:

        【解决方案3】:

        我创建了一个带有示例的故事板。你可以从here下载。

        您需要将嵌入视图更改为导航控制器,然后您可以使用 segue 在按钮按下时显示第二个视图。还隐藏/显示导航栏取决于要求。

        【讨论】:

          【解决方案4】:

          我不喜欢使用这些,但您可以通过访问数组 childViewControllers 从父控制器获取子视图控制器。在视图确实加载时,您需要遍历所有这些并找到可以类型转换为您的视图控制器类型的一个,例如

          childViewControllers.flatMap { $0 as? AViewController }.first

          既然您找到了正确的视图控制器,我建议您将自己指定为委托人

          childViewControllers.flatMap { $0 as? AViewController }.first.delegate = self

          或者只是添加一个按钮目标

          childViewControllers.flatMap { $0 as? AViewController }.first.button.addTarget...

          现在,如果您简单地同时嵌入 2 个视图控制器(有 2 个内容视图)并根据您显示的内容隐藏一个或另一个,则可以轻松完成此操作。至少通过这种方式,您可以立即分配连接。如果不是这种情况,那么您将需要在设置新控制器或分配初始化新视图控制器的连接时再次迭代。

          在这种情况下,似乎最好扭转系统:加载子视图控制器时,而不是调用

          self.delegate = parentViewController as? AViewControllerDelegate
          

          虽然这可行,但子视图控制器控制其侦听器的身份似乎是错误的,因此我建议您避免此类编码。

          我通常为容器视图使用自定义实现,您可以执行相同的操作,或者至少子类化原生视图并定位方法,以便您的代码看起来像:

          private onBPressed() {
              containerView.setViewController(viewController: BViewController(delegate: self), animation: .fade)
          }
          

          【讨论】:

            【解决方案5】:

            当您在视图 A 中按 Button A 时:

            @IBAction func BtnAPress(_ sender: Any)
            {
               //Moving Storyboard
               let Storyboard = UIStoryboard(name: "Main", bundle: nil)
               let MainVC : UIViewController = Storyboard.instantiateViewController(withIdentifier: "ViewControllerB")
               self.present(MainVC, animated: true, completion: nil)
            }
            

            【讨论】:

            猜你喜欢
            • 2016-12-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多