Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何获取对主视图控制器的引用?_Swift_Cocoa - Fatal编程技术网

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

Swift 如何获取对主视图控制器的引用?,swift,cocoa,Swift,Cocoa,在一个视图中,我对我的核心数据数据库进行了一些更改,该数据库显示在主视图控制器的一个表中。在做了这些更改之后,我想使用table toreloadData()来显示我添加的新记录,但是我找不到一种方法来获取对它的引用以调用函数 我试过这个: let window = NSApplication.shared.mainWindow 我想如果我能得到窗口,我也许能得到它的视图控制器,但由于某种原因,window是nil。我觉得这应该是一件直截了当的事情,但我找不到一个方法来做 如果这是不可能的,或

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

我试过这个:

let window = NSApplication.shared.mainWindow
我想如果我能得到窗口,我也许能得到它的视图控制器,但由于某种原因,
window
nil
。我觉得这应该是一件直截了当的事情,但我找不到一个方法来做

如果这是不可能的,或者有更好的方法来做我想做的事情,那也会很有用


编辑:不知道为什么,但是
NSApplication.shared.mainWindow
不再返回
nil
,而是我实际正在进行更改的视图窗口(不是主
ViewController
窗口)

我认为您应该使用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)

一种解决方案是在
AppDelegate

var mainViewController : MainViewController?
MainViewController的
viewDidLoad
中设置属性

override viewDidLoad() {
    super.viewDidLoad()
    let appDelegate = NSApp.delegate as! AppDelegate
    appDelegate.mainViewController = self
}
然后可以从任何地方重新加载表视图

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

如果让mainViewController=UIApplication.shared.keyWindow.rootViewController作为?MainViewControler{//Call method here.}
UIApplication
用于iOS应用程序,对吗?是的。它适用于iOS应用程序。如果让mainViewController=NSApplication.sharedApplication().keyWindow?.contentViewController为?ManinViewController{//Invoke your method here}@Rohi我的应用程序适用于macOS