containerView內容我有三個viewControllers 主要,一個,乙。 主視圖控制器擁有ContainerView和其他內容以及containerView中的所有交易。 ViewControllerA has ButtonA當按下它時容器的內容必須更改爲ViewControllerB 我該怎麼做?我找不到任何類似的例子。開關從內部的viewController
回答
雖然點擊按鈕a實施MainViewController委託方法。發佈通知到mainView。在Container中刪除viewController A並添加View Controller B.
當您從視圖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)
}
我已經創建了樣本storybaord。你可以從here下載它。
您需要將嵌入視圖更改爲導航控制器,然後可以使用segue在按鈕按下時顯示第二個視圖。還隱藏/顯示導航欄取決於需求。
您將需要爲此創建創建委託。 首先創建一個協議
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)
}
我不喜歡使用這些,但是您可以通過訪問數組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)
}
- 1. 從didFinishLaunchingWithOptions打開ViewController
- 2. 內部開關語句mpdf
- 3. UINavigationController viewController內部溝通
- 4. 立即關閉開關內部
- 5. Div的內部Div從底部開始
- 6. 使用內部開關的情況下
- 7. 開關櫃內部的可變定義
- 8. 從內存中刪除ViewController
- 9. 從內部展開列表
- 10. MvvmCross ShowViewModel從內部開始()
- 11. 從UIToolbar內部展開UIView?
- 12. iPad:如何關閉從「彈出」ViewController內的UIPopoverController
- 13. 從內部的onClick(視圖v)開關(v.getId()調用方法
- 14. Javascript:從內部關閉打開的窗口
- 15. UICollectionView內的ViewController
- 16. 使用的viewController打開相同的viewController
- 17. 從ViewController傳遞數據到Viewcontroller,現在是TabBarController的一部分
- 18. 從UIAlertView開始一個新的ViewController
- 19. 如何從AppDelegate打開特定的ViewController?
- 20. 如何從golang中開關盒內定義的功能內部跳出開關盒?
- 21. 如何從我的GameScene.swift中關閉ViewController?
- 22. 打開新的ViewController
- 23. 從一個ViewController繼續到Tab Bar Controller內的另一個ViewController?
- 24. 在TabBarController內的NavigationController中從(Table)ViewController呈現模態ViewController
- 25. 從內部C/C++程序訪問GCC編譯器開關
- 26. 從內部存儲器打開後,Android PDF立即關閉
- 27. bootstrap手風琴觸發器從內部打開/關閉
- 28. rightsidebar從內容div的底部開始
- 29. 嵌套開關:外部開關在退出內部開關後自動執行第二種情況
- 30. 從外部viewcontroller訪問時未初始化ViewController屬性
請參閱該視頻@ 03:55分鐘:https://www.youtube.com/watch?v = e2s2c8PrMZE –