我已经尝试在SO上遵循大量示例和其他questions。正在添加视图控制器,但是它将视图容器放置在视图中,而不是视图容器中。这是我的意思的镜头。
我在主视图控制器和容器视图上有一个标签栏。点击选项卡栏上的项目时,应该抓住控制器并将其加载到容器视图中。这是我如何执行的代码。
@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)
}
}
这是Swift3。我不知道我做错了什么。任何帮助表示赞赏。
更新资料
尽管经过无数次更改/尝试后,我始终没有从视图切换到以编程方式工作,但我的确找到了另一种将Segue与多个视图容器结合使用的方法(here。这不是理想的选择,因为它占用了更多内存,但是可以工作。
最佳答案
视图控制器只是UIView
的包装。因此,最后,您将始终拥有作为子视图添加到容器视图的控制器视图。
关键是您仍将获得视图控制器的所有通知,例如旋转更改,布局...
我使用的是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)
关于ios - 将 View Controller 添加到容器 View 覆盖 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40636997/