我会尽力解释我的问题,所以提前谢谢。
我通常通过让每个视图控制器代表不同的视图来构建具有许多视图控制器的应用程序。现在,我正在创建一个包含许多不同视图的大型应用程序。我不希望在我的应用程序中有15个以上的viewControllers。我宁愿让一个视图控制器继承不同的UIViews。
例如,如果在我的菜单栏上选择"设置"选项。然后我将被带到 selectionController 并让selectionController继承名为设置视图
的UIView目前我可以导航到我的settingsController并让Navbar代表所选的选项。但是我如何继续继承 SettingsView 呢?
的HomeController
class HomeController: UIViewController {
lazy var menu: Menu = {
let menuLauncher = Menu()
menuLauncher.homeController = self
return menuLauncher
}()
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title = "Home"
view.backgroundColor = Color.blue
navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named: "menu"), style: .plain, target: self, action: #selector(displayMenu))
}
func displayController(menuOption: MenuOption) {
let selectionController = UIViewController()
selectionController.navigationItem.title = menuOption.name
selectionController.view.backgroundColor = Color.blue
navigationController?.navigationBar.tintColor = UIColor.white
navigationController?.pushViewController(selectionController, animated: true)
}
@objc func displayMenu() {
menu.displayMenu()
}
}
MenuView
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return menuOptions.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! MenuCell
let menuOption = menuOptions[indexPath.row]
cell.menuOption = menuOption
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: collectionView.frame.width, height: 30)
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let menuOption = self.menuOptions[indexPath.row]
print(menuOption.name)
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
self.blackView.alpha = 0
if let app = UIApplication.shared.delegate as? AppDelegate, let window = app.window {
let width = window.frame.width - 150
self.menuView.frame = CGRect(x: -width, y: 0, width: 0, height: window.frame.height)
}
}) { (completed: Bool) in
//THIS IS WHERE I CALL MY FUNCTION TO SET UP THE SELECTIONCONTROLLER
self.homeController?.displayController(menuOption: menuOption)
}
}
override init(frame: CGRect) {
super.init(frame: frame)
self.collectionView.delegate = self
self.collectionView.dataSource = self
collectionView.register(MenuCell.self, forCellWithReuseIdentifier: cellId)
setUpView()
setUpCollectionView()
}
选择一个选项后(以索引路径的形式),并在菜单动画完成后。我在 HomeController 中调用我的函数displayController并设置新控制器。
我如何实现视图呢?如果我选择"设置",如何让selectionController同时显示 SettingsView ?
答案 0 :(得分:0)
您可以将子视图添加到现有视图中:
//The container view can be in the vc with constraints already setup.
//Or you can use the vc's default view.
enum MyView: Int { case settingsView = 0, otherView }
//Add view
let view = UIView(frame: containerView.bounds)
view.tag = MyView.settingsView.rawValue
containerView.addSubview(view)
//Remove view
if let remove = containerView.viewWithTag(MyView.settingsView.rawValue) {
remove.removeFromSuperview()
}
答案 1 :(得分:0)
就我个人而言,我不认为有很多ViewController
是个问题。它为您可以利用的视图提供了生命周期控制等几个奖励。
一个很好的解释:https://stackoverflow.com/a/30459226/7591205
当视图变得复杂时,最好将其封装到ViewController
。
但是如果你坚持为{1} View
多个ViewController
。我建议使用容器视图概念,然后在其中切换视图。实现这一目标的一个好方法是使用UIStackView然后将所有视图放在那里。然后根据您的需要隐藏/显示。