【问题标题】:Change Container View Content through UI Button in Different Container View通过不同容器视图中的 UI 按钮更改容器视图内容
【发布时间】:2017-03-11 17:32:21
【问题描述】:

我目前有一个带有 2 个容器视图的 Viewcontroller。第一个用作导航,水平滚动以显示其他按钮(如材质设计中的停靠栏或滑动标签)。二是内容。我将如何通过第一个控制第二个容器视图中显示的内容? 这是一张图片,可以更好地说明我在说什么。

*注意我只是想更新视图的紫色部分。导航容器(蓝色)上方的所有内容都是静态的。

我已经研究了这个tutorial,如果我发现了什么,我会更新。

【问题讨论】:

    标签: ios user-interface


    【解决方案1】:

    我建议使用代表团

    按下“导航栏”中的按钮后,让它告诉控制器更改第二个容器视图的内容。


    更新

    在您的导航中添加协议:

    protocol NavigationDelegation: class {
        func userDidPressSomeButton(sender: NavigationViewController)
    }
    
    class NavigationViewController: UIViewController {
        ...
        weak var navDelegate: NavigationDelegation?
        @IBAction func someButton(_ sender: Any) {
            // some additional stuff
            ...
            // send delegation
            navDelegate?.userDidPressSomeButton(sender: self)
        }
        ...
    }
    

    在你的主控制器中,遵守协议并实现委托:

    class YourMainViewController: UIViewController, NavigationDelegation {
        ...
        var firstEmbeddedViewController: NavigationViewController?
        var secondEmbeddedViewController: SomeOtherViewController?
    
        // Accessing your embedded controllers    
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if let controller = segue.destination as? NavigationViewController {
                embeddedViewController = controller
                // Setting your main controller to delegate to
                embeddedViewController!.navDelegate = self
            }
            else if let controller = segue.destination as? SomeOtherViewController {
                secondEmbeddedViewController = controller
            }
        }
    
        // Implement the required protocol function
        func userDidPressSomeButton(sender: NavigationViewController) {
            // You can now talk to your second embedded view, e.g.,
            secondEmbeddedViewController.someVariable = someValue
            secondEmbeddedViewController.someFunction()
    
            // You can also use the sender variable to access your navigation properties, e.g.,
            // let someText = sender.buttonOutlet.textLabel?.text
        }
        ...
    }
    

    【讨论】:

    • 你有我可以参考的例子吗?
    • 我已经更新了我的答案,这里还有一个 youtube 视频链接,可以让您简单了解委派的工作原理:link(委派在 6:40 左右开始)
    • 主控制器是指紫色容器视图还是具有两个容器视图的 VC?
    • 拥有两个容器视图的 vc。我将紫色容器视图的嵌入式控制器命名为“SomeOtherViewController”。
    【解决方案2】:

    完全同意雷的观点。委托是最好和最灵活的解决方案。 我有几乎相同的问题,但有主视图和详细视图。我的解决方案在这里How to update DetailView

    【讨论】:

      【解决方案3】:

      主要VC:

      var container: ContainerViewController!
      
      override func viewDidLoad() {
      container!.segueIdentifierReceivedFromParent("first")
      
      }
      
      
      @IBAction func firstBtnPressed(_ sender: Any) {
      let vc = "first"
       container!.segueIdentifierReceivedFromParent(vc)
      
      }
      
      @IBAction func secondBtnPressed(_ sender: Any) {
      container!.segueIdentifierReceivedFromParent("second")
      }
      
      
      @IBAction func thirdBtnPressed(_ sender: Any) {
      container!.segueIdentifierReceivedFromParent("third")
      }
      
      
      
      
      
      override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      if segue.identifier == "container"{
      
          container = segue.destination as! ContainerViewController
      
      
      }
      }
      

      容器视图

      open class ContainerViewController: UIViewController {
      //Manipulating container views
      fileprivate weak var viewController : UIViewController!
      //Keeping track of containerViews
      fileprivate var containerViewObjects =         Dictionary<String,UIViewController>()
      
      /** Specifies which ever container view is on the front */
      open var currentViewController : UIViewController{
      get {
          return self.viewController
      
         }
       }
      
      
      fileprivate var segueIdentifier : String!
      
       /*Identifier For First Container SubView*/
      @IBInspectable internal var firstLinkedSubView : String!
      
      
      override open func viewDidLoad() {
      super.viewDidLoad()
      
      
      
      }
      open override func viewDidAppear(_ animated: Bool) {
      if let identifier = firstLinkedSubView{
          segueIdentifierReceivedFromParent(identifier)
      }
      }
      override open func didReceiveMemoryWarning() {
      super.didReceiveMemoryWarning()
      // Dispose of any resources that can be recreated.
      }
      
      func segueIdentifierReceivedFromParent(_ identifier: String){
      
      
      
      self.segueIdentifier = identifier
      self.performSegue(withIdentifier: self.segueIdentifier, sender: nil)
      
      
      }
      
      
      
      
      override open func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      if segue.identifier == segueIdentifier{
      
      
          //Remove Container View
          if viewController != nil{
      
      
              viewController.view.removeFromSuperview()
              viewController = nil
      
      
      
          }
              //Add to dictionary if isn't already there
              if ((self.containerViewObjects[self.segueIdentifier] == nil)){
                  viewController = segue.destination
                  self.containerViewObjects[self.segueIdentifier] = viewController
      
          }else{
              for (key, value) in self.containerViewObjects{
      
                  if key == self.segueIdentifier{
      
                      viewController = value
      
      
                  }
      
              }
      
      
          }
      
          self.addChildViewController(viewController)
          viewController.view.frame = CGRect(x: 0,y: 0, width: self.view.frame.width,height: self.view.frame.height)
          self.view.addSubview(viewController.view)
          viewController.didMove(toParentViewController: self)
      
      
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-11
        • 2017-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-27
        • 1970-01-01
        相关资源
        最近更新 更多