Как я могу установить делегата для протокола от дочернего VC назначения? - PullRequest
1 голос
/ 31 октября 2019

MasterVC -> DetailVC -> ChildVC

У меня есть SplitViewController с таблицей на стороне мастера и второй таблицей на стороне детализации. Ячейки таблицы детализации могут быть выбраны, что вызывает дочерний VC. В настоящее время у меня есть протокол, определенный на ведущем устройстве, который сообщает мне, когда была выбрана ячейка. (Таким образом, я могу обновлять детализацию по мере необходимости.) Я бы хотел, чтобы дочерний vc подробного представления также получал это сообщение, но я не уверен, как установить делегат. То, что я пытался использовать подготовку для перехода в ChildVC, чтобы получить ссылку на MasterVC следующим образом:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let nav = segue.destination as? UINavigationController {
        if let masterVC = nav.topViewController as? MasterVC {
            masterVC = self
        }
    }
}

Но, к сожалению, это, похоже, не работает. Я на правильном пути, по крайней мере? Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

класс равен reference type, поэтому, когда вы определяете делегат как class, вам не нужно делать что-то еще, и он должен работать

0 голосов
/ 31 октября 2019

Если вы хотите передать некоторые данные после прикосновения к ячейке в DetailVC, вы можете использовать NotificationCenter

class MasterVC: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(childVCDidSelect(_:)),
                                               name: DetailVC.selectionNotificationName,
                                               object: nil)
    }

    @objc func childVCDidSelect(_ value: String) {
        print("MasterVC recieve \(value) from DetailVC")
    }
}

class DetailVC: UIViewController, UITableViewDelegate {

    static var selectionNotificationName: NSNotification.Name {
        return NSNotification.Name(rawValue: "DetailVCSelectionNotification")
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // value variabl could by any type, maybe you want pass model for selected index path.
        let value = "your value"
        // When you call NotificationCenter post, you past value to all subscribers,
        // who has subcribed NotificationCenter.default.addObserver for DetailVC.selectionNotificationName
        NotificationCenter.default.post(name: DetailVC.selectionNotificationName, object: value)
    }
}

class ChildVC: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(childVCDidSelect(_:)),
                                               name: DetailVC.selectionNotificationName,
                                               object: nil)
    }

    @objc func childVCDidSelect(_ value: String) {
        print("ChildVC recieve \(value) from DetailVC")
    }
}

...