2017-03-11 10 views
0

現在、2つのコンテナビューを持つViewControllerがあります。最初のものはナビゲーションとして使用され、水平方向にスクロールして他のボタン(マテリアルデザインのドックやスライドタブなど)を表示します。 2番目はコンテンツです。最初のコンテナビューに表示されているコンテンツをどのように制御するのですか? ここでは、私が何を話しているかをよりよく説明する画像があります。 enter image description here異なるコンテナビューのUIボタンを使用してコンテナビューのコンテンツを変更

注:ビューの紫色部分のみを更新しようとしています。ナビゲーションコンテナの上のすべて(青色)は静的です。

私はこれを調べて、tutorialを見つけました。何かを見つけたら更新されます。

答えて

0

メイン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 


} 
} 

Conatinerビュー

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) 


} 

}

1

代表団を使用することをおすすめします。

「ナビゲーションバー」のボタンを押した後、コントローラに2番目のコンテナビューの内容を変更するように指示します。


UPDATE:あなたのナビゲーションで

プロトコルを追加:プロトコルに準拠し、委任を実装し、あなたのメインコントローラ内部

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 
    } 
    ... 
} 
+0

あなたは、私が参照できる例はありますか? – ethanfox27

+0

私は自分の答えを更新しました。ここでは、委任の仕組みに関する簡単なアイデアを提供するためのyoutubeビデオリンクもあります:[link](https://www.youtube.com/watch?v=D-xXRSCLNFQ)約6:40) –

+0

メインコントローラでは、両方のコンテナビューで紫色のコンテナビューまたはVCを意味しますか? – ethanfox27

0

は絶対に同意しますレイと委任は最も優れた柔軟性のあるソリューションです。 私はほとんど同じ問題を抱えていましたが、マスタービューと詳細ビューがありました。私のソリューションはここHow to update DetailView

関連する問題