Почему мое представление не переключается на другой контроллер дочернего представления в моем представлении контейнера? - PullRequest
0 голосов
/ 08 мая 2020

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

Здесь это картина иерархии. Поскольку я встроил свой tableView в контейнер , мне пришлось реализовать * delegateProtocol .

My EmbeddedTableViewController содержит logi c для выбора соответствующих строк и делегирует строки MenuController . Он также содержит integer на основе Enum для выбора соответствующей строки в правом разделе. Fe case a = 0 (строка 0, раздел 0) и так далее:

enum MenuType: Int, CaseIterable {

    case a = 0,  b = 1,  c = 2,  d = 3
    case e = 10,  f = 11

    static func fromRow(row: Int, section: Int) -> MenuType {
        return MenuType(rawValue: section * 10 + row)!
    }

}

class EmbeddedTableViewController: UITableViewController {

    var delegate : EmbeddedTableViewControllerDelegate?

    var didTapMenuType: ((MenuType) -> Void)?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        delegate?.rowTapped(type: MenuType.fromRow(row: indexPath.row, section: indexPath.section))
        dismiss(animated: true)
    }
}

protocol EmbeddedTableViewControllerDelegate {
    func rowTapped(type: MenuType)
}

Пока все хорошо: теперь я получаю MenuType как необработанное значение .. именно то, что я хотеть. Чтобы отреагировать на нажатие строки, я реализовал делегат и prepareForSegue в моем MenuController :

class MenuController: UIViewController, EmbeddedTableViewControllerDelegate {

    var menuTableViewCtrl : EmbeddedTableViewController?
    override func viewDidLoad() {
        super.viewDidLoad()

    }
  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "tableViewSegue" {
            self.menuTableViewCtrl = (segue.destination as! EmbeddedTableViewControllerDelegate)
            self.menuTableViewCtrl!.delegate = self
        }
    }

    func rowTapped(type: MenuType) {
        guard let mainCtrl = storyboard?.instantiateViewController(withIdentifier: "MainViewVc") as? MainViewVc else {return}
        _ = mainCtrl.self.view
        mainCtrl.transitionToNew(type)
    }

И, наконец, в моем MainV c Я вызываю метод transitionToNew , который получает тип в качестве входного параметра:

 func transitionToNew(_ type : MenuType) {

        switch type {
        case .a:
            let storyBoard = UIStoryboard(name: "Main", bundle: nil)
            let ctrl = storyBoard.instantiateViewController(withIdentifier: "NavigationViewController") as! Ctrl
            addChildView(viewController: ctrl, in: containerView)
 ...
 }

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

Также при добавлении дочернего представления с Button -action:

@IBAction func ctrlAction(_ sender: UIButton) {
        addChildView(viewController: ctrlAction, in: containerView)
    }

он работает . Только когда я пытаюсь добавить ребенка в боковое меню, он не работает. Распечатка типа в корпусе коммутатора дает мне правильный тип, он переходит в правильный регистр, возвращая правильные представления ... Я несколько часов пытался выяснить, что не так с моим кодом ... Сначала я думал, что что-то не так с моим контейнером , но он работает с кнопкой действиями ... Кто-нибудь понял, почему он не меняет представления?

...