Я создал боковое меню, используя этого урока , и я могу понять, как оно работает по большей части. Чего я не могу сделать, так это использовать делегатов и протоколы для открытия разных представлений контейнера в 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 на основе выбора бокового меню.