2016-11-16 7 views
0

私は多くの例や他のものに続いて、questionsを試してみました。ビューコントローラは追加されていますが、ビューコンテナはビューコンテナではなくビューに配置されています。ここに私が意味するものがあります。コンテナビューにビューコントローラを追加すると、表示が上書きされます

enter image description here

私は、プライマリビューコントローラとコンテナビューのタブバーを持っています。タブバーの項目をタップすると、コントローラーをつかんでコンテナビューにロードすることになっています。私がそれをやっている方法のコードはここにあります。

@IBOutlet weak var tabBar: UITabBar! 
@IBOutlet weak var containerView: UIView! 
var currentViewController: UIViewController! 
var radarViewController: UIViewController! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
    let storyboard = self.storyboard 
    let currentViewController = storyboard?.instantiateViewController(withIdentifier: "WeatherCurrentViewController") as! WeatherCurrentViewController 
    self.currentViewController = UINavigationController(rootViewController: currentViewController) 
    let radarViewController = storyboard?.instantiateViewController(withIdentifier: "WeatherRadarViewController") as! WeatherRadarViewController 
    self.radarViewController = UINavigationController(rootViewController: radarViewController) 
} 
func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { 
    if item.tag == 1 { 
     containerView.addSubview(currentViewController!.view) 
     currentViewController.didMove(toParentViewController: self) 
    } 

    if item.tag == 2 { 
     containerView.addSubview(radarViewController!.view) 
     radarViewController.didMove(toParentViewController: self) 
    } 
} 

これはスイフト3です。私はそれが何であるか分かりません。間違っています。どんな助けもありがとうございます。

更新

私は多数の変更/試行した後、プログラムで動作するように、ビューの切り替えをやったことがなかったが、それはより多くのメモリを結びつけるために、私は複数のビューコンテナ(here。未理想的でseguesを使用して別の方法を見つけましたそれは。

+0

あなたは、これはさらに「それが配置されて説明することができますが、それは次のようになりますビューコンテナではなく、ビューコントローラに表示されます。 – Frankie

+0

@Frankie私はビューコンテナに置かれていないようですが、親ビューは –

答えて

0

ビューコントローラがUIView単なるラッパーで動作します。この点は最後にあなたが常にコントローラがそれはコンテナビューのサブビューとして追加されて表示されますので。

あなたはまだすべての通知を取得しますfまたは回転の変更、レイアウトなどのビューコントローラ...

私はUIViewサブクラスのクラスを使用します。

import UIKit 

class ContentControllerView: UIView { 

    weak var parrentViewController: UIViewController? 
    private(set) var currentController: UIViewController? 

    func setViewController(controller: UIViewController) { 
     guard let parrentViewController = parrentViewController else { 
      print("ContentControllerView error: You need to set a parrentViewController to add a new view controller") 
      return 
     } 

     if controller.view != currentController?.view { 
      currentController?.willMove(toParentViewController: nil) // Notify the current controller it will move off the parent 
      controller.willMove(toParentViewController: parrentViewController) // Notify the new controller it will move to the parent 
      parrentViewController.addChildViewController(controller) // Add child controller 
      currentController?.view.removeFromSuperview() 
      currentController?.didMove(toParentViewController: nil) // Notify the current controller it did move off the parent 

      controller.view.translatesAutoresizingMaskIntoConstraints = false // Disable this to add custom constraints 
      self.addSubview(controller.view) // Add as subview 
      // Assign new constraints 
      self.addConstraint(NSLayoutConstraint(item: self, attribute: .left, relatedBy: .equal, toItem: controller.view, attribute: .left, multiplier: 1.0, constant: 0.0)) 
      self.addConstraint(NSLayoutConstraint(item: self, attribute: .right, relatedBy: .equal, toItem: controller.view, attribute: .right, multiplier: 1.0, constant: 0.0)) 
      self.addConstraint(NSLayoutConstraint(item: self, attribute: .top, relatedBy: .equal, toItem: controller.view, attribute: .top, multiplier: 1.0, constant: 0.0)) 
      self.addConstraint(NSLayoutConstraint(item: self, attribute: .bottom, relatedBy: .equal, toItem: controller.view, attribute: .bottom, multiplier: 1.0, constant: 0.0)) 

      self.layoutIfNeeded() 

      currentController?.removeFromParentViewController() // remove the current controller from parrent 
      controller.didMove(toParentViewController: parrentViewController) // Notify the new controller it did move to the parent 

      currentController = controller 
     } 
    } 

} 

ビューはストーリーボードに追加することができますが、その後のコードでは、ビューコントローラに割り当てる必要があります:

self.contentControllerView.parrentViewController = self 
self.contentControllerView.setViewController(controller: controller) 
+0

ありがとうございました。私は本当に他の人がやったことをコピーして貼り付ける以外に、それが動作するようにしていないコードが何であるかを理解したいと思っています。あなたが提供できる洞察はありますか? –

+0

通話を比較してみてください –

関連する問題