Я реализовал боковое меню со строками и разделами и не могу понять, почему представление не меняется, когда пользователь нажимает строку в боковом меню ...
Здесь это картина иерархии. Поскольку я встроил свой 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)
}
он работает . Только когда я пытаюсь добавить ребенка в боковое меню, он не работает. Распечатка типа в корпусе коммутатора дает мне правильный тип, он переходит в правильный регистр, возвращая правильные представления ... Я несколько часов пытался выяснить, что не так с моим кодом ... Сначала я думал, что что-то не так с моим контейнером , но он работает с кнопкой действиями ... Кто-нибудь понял, почему он не меняет представления?