2017-08-07 64 views
0

containerView內容我有三個viewControllers 主要一個主視圖控制器擁有ContainerView和其他內容以及containerView中的所有交易。 ViewControllerA has ButtonA當按下它時容器的內容必須更改爲ViewControllerB 我該怎麼做?我找不到任何類似的例子。開關從內部的viewController

enter image description here

回答

1

雖然點擊按鈕a實施MainViewController委託方法。發佈通知到mainView。在Container中刪除viewController A並添加View Controller B.

0

當您從視圖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) 
} 
+0

請參閱該視頻@ 03:55分鐘:https://www.youtube.com/watch?v = e2s2c8PrMZE –

0

我已經創建了樣本storybaord。你可以從here下載它。

您需要將嵌入視圖更改爲導航控制器,然後可以使用segue在按鈕按下時顯示第二個視圖。還隱藏/顯示導航欄取決於需求。

1

您將需要爲此創建創建委託。 首先創建一個協議

protocol ViewControllerADelagate { 
    func didPressOnButtonA() 
} 

在ViewControllerA添加以下委託變量

class ViewControllerA { 
    .... 

    var delegate : ViewControllerADelagate? 
    .... 
} 

在ViewControllerA添加以下按下按鈕

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

在MainViewController ViewControllerA的代表分配給自 像

vcA.delegate = self 

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) 
} 
0

我不喜歡使用這些,但是您可以通過訪問數組childViewControllers從父控制器獲取子視圖控制器。在視圖沒有負載,你需要通過所有這些,並找到一個可以typecast到你的視圖控制器類型,如

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) 
} 
相關問題