Представление контроллеров представления с другим представлением в зависимости от того, какая опция выбрана: Swift 4 - PullRequest
0 голосов
/ 22 мая 2018

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

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

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

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

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

}

После выбора опции (в виде пути индекса) и после завершения анимации меню.Я вызываю свою функцию displayController в HomeController и настраиваю новый контроллер.

Как бы я также реализовал представление?Если я выбрал «Настройки», как я могу получить selectionController для отображения SettingsView ?

Ответы [ 2 ]

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

Лично я не думаю, что иметь много ViewController - это проблема.Это дает пару бонусов, таких как управление жизненным циклом, представлению, которым вы можете воспользоваться.

Хорошее объяснение: https://stackoverflow.com/a/30459226/7591205

Когда представление усложняется, лучше инкапсулироватьсяв ViewController.

Но если вы придерживаетесь кратного View для 1 ViewController.То, что я хотел бы предложить, - это иметь представление о контейнере, а затем переключать свои представления внутри него.Хороший способ добиться этого - использовать UIStackView, а затем поместить туда все свои представления.Затем скрыть / показать в соответствии с вашими потребностями.

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

Вы можете добавить подпредставление к существующему представлению:

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