如何从目标 VC 的 child 为协议设置委托?

How can I set the delegate for a protocol from the child of the destination VC?

大师VC -> 细节VC -> 子VC

我有一个 SplitViewController,在主端有一个 table,在细节端有第二个 table。可以选择详细 table 个单元格,这会显示 child VC。目前,我在 master 上定义了一个协议,让我知道何时选择了一个单元格。 (这样我就可以根据需要更新细节方面。)我希望细节视图的 child vc 也能接收到该消息,但我不确定如何设置委托。我尝试过的是在 ChildVC 中使用 prepare for segue 来获取对 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
        }
    }
}

但遗憾的是,这似乎不起作用。至少我走在正确的轨道上吗?谢谢!

如果你想在 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")
    }
}

class 是 reference type,所以当您将委托定义为 class 时,您不需要做其他事情,它应该可以工作