Swift 4: невозможно нажать ViewController при нажатии кнопки.

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

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

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

По какой-то причине при вызове функции для отображения profileView ничего не происходит. Я реализовал подобную функцию раньше, но она не работает.

HomeController

//This function is called upon menu tap

func displayController(menuOption: MenuOption, view: UIView) {
    let selectionController = UIViewController()
    selectionController.view.frame = UIScreen.main.bounds
    selectionController.navigationItem.title = menuOption.name
    selectionController.view.backgroundColor = Color.defaultBackgrondColor

    selectionController.view.addSubview(view)

    navigationController?.navigationBar.tintColor = UIColor.white
    navigationController?.pushViewController(selectionController, animated: true)
}

Строка меню

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

//CARRY OUT ANIMATION FOR MENU BAR...

    }) { (completed: Bool) in
        let option = self.menuOptions[indexPath.row]

        switch option.name {
        case "Profile":

//This is where I call my function to display the new view

            self.homeController?.displayController(menuOption: option, view: ProfileView(frame: UIScreen.main.bounds))
        default:
            print("Staying on home page")
        }
    }
}

person Chandler Long    schedule 19.06.2018    source источник
comment
Убедитесь, что self.homeController не равен нулю. Если проблема не в этом, убедитесь, что homeController действительно находится в контроллере навигации.   -  person rmaddy    schedule 19.06.2018
comment
Когда я добавляю точку останова, домашний контроллер показывает ноль. Что нужно сделать для инициализации домашнего контроллера?   -  person Chandler Long    schedule 19.06.2018


Ответы (1)


Вы удостоверились, что контроллер навигации был инициализирован? Вы настраиваете домашний контроллер с помощью раскадровки или программно?

Если вы поместите точку останова в рассматриваемой строке, это должно дать вам больше информации о том, была ли она инициализирована или нет.

person rob    schedule 19.06.2018
comment
В какой момент вы инициализируете HomeController? Я предполагаю, что вы разместили точку останова в этой строке здесь ?: self.homeController? .DisplayController (menuOption: option, view: ProfileView (frame: UIScreen.main.bounds)) Свойство домашнего контроллера в этом случае является необязательным. . Когда необязательное свойство равно nil, любой последующий оператор не выполняется, иначе это приведет к сбою. - person rob; 19.06.2018
comment
У меня homeController обозначен как var homeController: HomeController?. Если бы я инициализировал его как let homeController = HomeController (), это вызовет сбой при запуске. - person Chandler Long; 19.06.2018
comment
Я безуспешно пытался добавить menuLauncher.homeController = self в функцию в HomeController. - person Chandler Long; 19.06.2018
comment
Я предполагаю, что MenuLauncher - это контроллер представления, содержащий код представления коллекции? Не могли бы вы назначить и создать домашний контроллер непосредственно перед тем, как выполнить на нем вызов? self.homeController = HomeController() self.homeController?.displayController(menuOption: option, view: ProfileView(frame: UIScreen.main.bounds)) Также я немного запутался, поскольку (насколько я понимаю) вы, по сути, создаете домашний контроллер только для того, чтобы представить SelectionController? - person rob; 19.06.2018
comment
Правильно. Итак, у меня есть домашний контроллер, который отображает homeView. Но у меня есть выдвигающееся меню, в котором есть collectionView с параметрами на выбор. После выбора индекса menuLauncher вызывает функцию из homeController. - person Chandler Long; 20.06.2018