Swift 4:以 UIView 作为框架呈现 ViewController
Swift 4: Presenting ViewControllers with a UIView as the frame
我会尽力解释我的问题,在此先感谢。
我通常通过让每个 ViewController 代表不同的视图来构建具有多个视图控制器的应用程序。现在,我正在创建一个包含许多不同视图的大型应用程序。我不想在我的应用程序中有 15 个以上的视图控制器。我宁愿让一个 ViewController 继承不同的 UIView。
例如,如果在我的菜单栏上 select "Settings" 选项。然后我会被带到 selectionController 并让 selectionController 继承名为 Settings View
的 UIView
目前我可以导航到我的 settingsController 并让导航栏代表 selected 选项。但是我该如何继承 View 呢?
当一个选项被 selected 时调用这个函数..
//Whatever option selected will affect which view is inherited
let option = self.menuOptions[indexPath.row]
if option.name != "Home" {
self.homeController?.displayController(menuOption: menuOption, view: self.settingsView)
}
家庭控制器
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, view: UIView) {
let selectionController = UIViewController()
selectionController.navigationItem.title = menuOption.name
selectionController.view.backgroundColor = Color.blue
//Why dosen't this present the view I have assigned to it??
selectionController.view.addSubview(HomeView(frame: view.frame))
navigationController?.navigationBar.tintColor = UIColor.white
navigationController?.pushViewController(selectionController, animated: true)
}
@objc func displayMenu() {
menu.displayMenu()
}
}
您似乎是在此处的“设置”视图中发送:
self.homeController?.displayController(menuOption: menuOption, view: self.settingsView)
但我没有看到您实际将该视图分配给视图控制器的位置:
func displayController(menuOption: MenuOption, view: UIView) {
//[...]
//What is HomeView?
selectionController.view.addSubview(HomeView(frame: view.frame))
//[...]
navigationController?.pushViewController(selectionController, animated: true)
}
您将 HomeView 传递给 ViewController,而不是传入的视图,并将 HomeView 的大小设置为传入视图的框架(在本例中为设置)。
我希望是这样的:
func displayController(menuOption: MenuOption, view: UIView) {
let selectionController = UIViewController()
selectionController.navigationItem.title = menuOption.name
selectionController.view.backgroundColor = Color.blue
selectionController.view.addSubview(view)
navigationController?.navigationBar.tintColor = UIColor.white
navigationController?.pushViewController(selectionController, animated: true)
}
不知道 HomeView 做了什么,但假设它有一些你想要的其他东西,也许传入的视图会成为 HomeView 的子视图,然后 HomeView 会 return 你想要的。在那种情况下:
selectionController.view.addSubview(HomeView(selectedView: view))
在这种情况下,HomeView 应该在内部从传入的视图中推导出其框架大小,因此 frame 参数变得不必要。
我会尽力解释我的问题,在此先感谢。
我通常通过让每个 ViewController 代表不同的视图来构建具有多个视图控制器的应用程序。现在,我正在创建一个包含许多不同视图的大型应用程序。我不想在我的应用程序中有 15 个以上的视图控制器。我宁愿让一个 ViewController 继承不同的 UIView。
例如,如果在我的菜单栏上 select "Settings" 选项。然后我会被带到 selectionController 并让 selectionController 继承名为 Settings View
的 UIView目前我可以导航到我的 settingsController 并让导航栏代表 selected 选项。但是我该如何继承 View 呢?
当一个选项被 selected 时调用这个函数..
//Whatever option selected will affect which view is inherited
let option = self.menuOptions[indexPath.row]
if option.name != "Home" {
self.homeController?.displayController(menuOption: menuOption, view: self.settingsView)
}
家庭控制器
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, view: UIView) {
let selectionController = UIViewController()
selectionController.navigationItem.title = menuOption.name
selectionController.view.backgroundColor = Color.blue
//Why dosen't this present the view I have assigned to it??
selectionController.view.addSubview(HomeView(frame: view.frame))
navigationController?.navigationBar.tintColor = UIColor.white
navigationController?.pushViewController(selectionController, animated: true)
}
@objc func displayMenu() {
menu.displayMenu()
}
}
您似乎是在此处的“设置”视图中发送:
self.homeController?.displayController(menuOption: menuOption, view: self.settingsView)
但我没有看到您实际将该视图分配给视图控制器的位置:
func displayController(menuOption: MenuOption, view: UIView) {
//[...]
//What is HomeView?
selectionController.view.addSubview(HomeView(frame: view.frame))
//[...]
navigationController?.pushViewController(selectionController, animated: true)
}
您将 HomeView 传递给 ViewController,而不是传入的视图,并将 HomeView 的大小设置为传入视图的框架(在本例中为设置)。
我希望是这样的:
func displayController(menuOption: MenuOption, view: UIView) {
let selectionController = UIViewController()
selectionController.navigationItem.title = menuOption.name
selectionController.view.backgroundColor = Color.blue
selectionController.view.addSubview(view)
navigationController?.navigationBar.tintColor = UIColor.white
navigationController?.pushViewController(selectionController, animated: true)
}
不知道 HomeView 做了什么,但假设它有一些你想要的其他东西,也许传入的视图会成为 HomeView 的子视图,然后 HomeView 会 return 你想要的。在那种情况下:
selectionController.view.addSubview(HomeView(selectedView: view))
在这种情况下,HomeView 应该在内部从传入的视图中推导出其框架大小,因此 frame 参数变得不必要。