Swift 4: представление ViewControllers с UIView в качестве фрейма - PullRequest
0 голосов
/ 30 мая 2018

Я сделаю все возможное, чтобы объяснить мою проблему, поэтому заранее спасибо.

Обычно я создаю приложения со многими контроллерами представления, когда каждый ViewController представляет отдельное представление.Прямо сейчас я создаю большое приложение с множеством разных представлений.Я не хочу иметь 15 плюс View Controllers в моем приложении.Я бы предпочел, чтобы один ViewController наследовал разные UIViews.

Например, если в строке меню я выбрал опцию «Настройки».Затем меня перенаправят в selectionController, и selectionController унаследует UIView с именем View Settings

. В данный момент я могу перейти к своему settingsController и сделать Navbar представленной выбранной опцией.Но как бы я унаследовал и View?

Когда выбран параметр, эта функция называется ..

//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()
}

}

1 Ответ

0 голосов
/ 30 мая 2018

Похоже, что вы отправляете в представлении настроек здесь:

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 вернет то, что вы хотите.В этом случае:

 selectionController.view.addSubview(HomeView(selectedView: view))

В этом случае HomeView должен внутренне определить размер своего кадра из переданного представления, поэтому параметр кадра становится ненужным.

...