从父视图控制器调用子视图实例的函数

Call function of child view instance from parent view controller

我有一个由 motherViewController 控制的 motherView,其中有一个容器视图。容器视图由 childViewController 控制。 childView 包含一个 tableView。

现在我在 childViewController 中有一个 cleanTableView 函数,"resets" 调用 tableView 时。

func clean() {
    let indexPath = IndexPath(row: 0, section: 0)
    if let cell = tableView.cellForRow(at: indexPath) {
        if cell.accessoryType == .checkmark {
            cell.accessoryType = .none
        }
    }
}

在我的 motherView 中有一个按钮。触摸此按钮时,它会调用 motherViewController 上的操作。

@IBAction func cancelButtonTapped(_ sender: UIBarButtonItem) {

       //call clean method of containerView instance

}

如何从此操作调用特定 childView 实例上的 cleanTableView 函数?

假设只有一个子视图控制器:

@IBAction func cancelButtonTapped(_ sender: UIBarButtonItem) {
    (children.first as? ChildViewController)?.clean()
}

关于 API 更改/重命名的一些附加信息:

childViewControllers 属性 在 Swift 4.2 中已重命名为 children。参见 https://developer.apple.com/documentation/uikit/uiviewcontroller/1621452-children?changes=latest_minor

有很多方法可以做到这一点,具体取决于组件的互连性以及您希望将它们绑定的紧密程度。三个例子:

  • 紧绑定:"mother"VC调用"child"VC的方法,VC调用子View的方法。

  • 与委托的松散绑定:创建委托协议,link 子视图与母视图 VC 通过此委托。妈妈VC接着给委托打电话

  • 与通知断开连接:让子视图监听特定的 "clear" 通知。有母亲 VC post 那个通知。两者之间没有直接的 links。

每种方法的优缺点。最佳互动取决于您的具体情况。