Обработка делегатов и протоколов при открытии V C из бокового меню - PullRequest
0 голосов
/ 03 мая 2020

Я создал боковое меню, используя этого урока , и я могу понять, как оно работает по большей части. Чего я не могу сделать, так это использовать делегатов и протоколы для открытия разных представлений контейнера в HomeViewController. Я уже несколько раз использовал делегаты и протоколы и знаю, как их настроить, но вопрос в том, где мне назначить делегат = self?

В MenuViewController, который содержит табличное представление для меню, я добавил вызов делегата (openDelegate), чтобы открыть меню. Другой делегат был включен в учебное пособие, и он связывается с контроллером представления контейнера, в котором находится меню и домашние виртуальные каналы. Я хочу напрямую связаться с домашним V C, где я буду размещать контейнер V C для других экранов:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let menuOption = MenuOption(rawValue: indexPath.row)
        delegate?.handleMenuToggle(forMenuOption: menuOption)
        openDelegate?.openMenu(tappedMenu: menuOption)
    }

Протокол для этого находится в моем контроллере Home View, который используется по умолчанию V C, который открывается при загрузке бокового меню; конечно, это может быть в отдельном файле протокола:

protocol OpenScreenDelegate {
    func openMenu(tappedMenu openScreen : MenuOption?)
}

А остальная часть моего дома V C выглядит примерно так:

class HomeViewController: UIViewController, OpenScreenDelegate  {

var openDelegate : OpenScreenDelegate?
// other initializers

func openMenu(tappedMenu openScreen: MenuOption?) {
        addAccount()
    }

func addAccount() {
        addChild(accountViewController)
        view.addSubview(accountViewController.view)
        accountViewController.didMove(toParent: self)


accountViewController.view.translatesAutoresizingMaskIntoConstraints = false
            accountViewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
            accountViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
            accountViewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
            accountViewController.view.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        }
}

Просто чтобы добавить немного контекста Я программно вставляю V C для деталей профиля учетной записи пользователя всякий раз, когда пользователь нажимает «учетную запись» из бокового меню. Для этого я проверяю через делегата, какое меню они нажали. Затем я использую делегат триггера для функции, которая помещает учетную запись V C поверх контроллера домашнего просмотра. Я знаю, что это, вероятно, не лучший способ сделать это, но я хочу, чтобы он хотя бы отображал различные VC на основе выбора бокового меню.

...