如何获得对主视图控制器的引用?

时间:2018-05-07 10:12:48

标签: swift cocoa

在一个视图中,我对核心数据数据库进行了一些更改,该数据库显示在主视图控制器的表中。进行这些更改后,我想要显示reloadData()以显示我添加的新记录,但我找不到一种方法来获取它来调用该函数。

我试过这个:

let window = NSApplication.shared.mainWindow

如果我能够获得窗口,我可能会得到它的视图控制器,但出于某种原因,windownil。我觉得这应该是一个直截了当的事情,但我找不到办法去做。

如果这是不可能的,或者有更好的方法来做我正在尝试的事情,那也是有用的。

编辑:不确定原因,但NSApplication.shared.mainWindow不再返回nil,但视图的窗口我实际上正在进行更改(不是主ViewController窗口)

2 个答案:

答案 0 :(得分:1)

我认为您应该使用NotificationCenter,如下所示

class MainController:UIViewController {

    @IBOutlet weak var tableview:UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(reload), name: NSNotification.Name("dataUpdated"), object: nil)
    }

    deinit {
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name("dataUpdated"), object: nil)
    }

    @objc func reload() {
        tableview.reloadData()
    }
}

使用

//在cordata更改后,只需发布​​通知。

NotificationCenter.default.post(name: NSNotification.Name("dataUpdated"), object: nil)

答案 1 :(得分:1)

一种解决方案是在AppDelegate

中创建对主视图控制器的引用
var mainViewController : MainViewController?

viewDidLoad

MainViewController中设置属性
override viewDidLoad() {
    super.viewDidLoad()
    let appDelegate = NSApp.delegate as! AppDelegate
    appDelegate.mainViewController = self
}

然后你可以从任何地方重新加载表视图

let appDelegate = NSApp.delegate as! AppDelegate
appDelegate.mainViewController?.tableView.reloadData()