从另一个ViewController访问UITableViewController

时间:2019-12-13 10:31:12

标签: swift uitableview

我的问题听起来很基础,但是我想知道从另一个视图控制器访问UITableViewController及其tableView和属性的最佳和最简单的方法。非常感谢...。

3 个答案:

答案 0 :(得分:1)

您应该将UITableViewController实例设置为新视图控制器的变量。

例如

class VC1: UIViewController {
func launch() {
let vc2 = VC2()
vc2.previousVC = self
present(vc2,..)
}
}

claass VC2: UIViewController {
weak var previousVC: VC1?
}

如果使用segues,则可以执行相同的设置:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "SomeSegue" {
        if let vc2 = segue.destination as? VC2 {
                vc2.previousVC = self
        }
    }
}

答案 1 :(得分:0)

为什么不为此使用被动/异步方法。对于异步方法,您可以使用通知中心(还有许多其他方法)。在您拥有tableView的第一个控制器中,添加以下代码:

NotificationCenter.default.addObserver(self, selector: #selector(onDidReceiveNotification(_:)), name: .didReceiveNotification, object: nil)
@objc func onDidReceiveNotification(_ notification:Notification) {
    // Do something now with your UITableView   
}

在需要更改或对第一个视图控制器及其tableView进行某些操作的第二个控制器中,您发布通知:

NotificationCenter.default.post(name: .didReceiveNotification, object: nil)

您还可以使用RxSwift和RxCocoa的反应性方法,创建可观察的对象,并在onNext()事件中观察其值。 您可以在第一个视图控制器中创建如下主题:

let subject = PublishSubject<String>()
let subscriptionOne = subject.subscribe(onNext: { string in
    // Do something now with your UITableView. You can pass your custom model instead of string
    print("First Subscription: ", string)                     
})

现在,在第二个视图控制器中,您可以在完成一些工作后调用onNext()方法,如下所示:

subject.onNext("3")

答案 2 :(得分:0)

到目前为止,最简单的方法是将其绑定到全局变量。

使全局变量集等于UITableViewController(),例如 "~ts/Extensions/ExtensionMethods"

然后在viedDidLoad()函数中,键入var tableVC = UITableViewController()以将其设置为等于当前视图控制器。

从那里开始tableVC = self即可轻松进行更改。