如何在NSWindowController中调用NSViewController的函数?
在NSWindowController中调用CustViewController的printCustomers方法
首先是你的CustViewController代码:
class CustViewController: NSViewController { @IBOutlet weak var tableView: NSTableView! @IBOutlet weak var statusLabel: NSTextField! fileprivate var selectedOptionFromMenu = "" @objc var contacts:[Person] = [] @objc var backUpContacts:[Person] = [] @IBAction func printCustomers(_ sender: Any?) { // 这里是你的打印逻辑 } }
问题描述
我希望在另一个类(NSWindowController)中调用printCustomers函数,请问在NSWindowController类中该如何编写代码?
我尝试了以下代码:
let printAction = CustViewController.printCustomers(<#T##self: CustViewController##CustViewController#> )
但我不知道该如何编写参数,而且这可能不是正确的实现方式?
解决方案
你尝试的写法是直接调用类方法,但printCustomers是实例方法,必须通过CustViewController的具体实例来调用,不能直接用类名调用。下面是几种可行的实现方式:
方式一:通过Window的ContentViewController获取实例
如果你的CustViewController是窗口的根内容控制器,可以通过NSWindowController的window?.contentViewController来获取实例,再强转成CustViewController:
class YourWindowController: NSWindowController { func triggerPrint() { // 获取并强转实例 guard let custVC = window?.contentViewController as? CustViewController else { print("无法获取CustViewController实例") return } // 调用方法,sender可以传nil或者当前对象 custVC.printCustomers(self) } }
方式二:通过IBOutlet直接关联实例
如果是在Storyboard/XIB中,可以给NSWindowController添加一个CustViewController的IBOutlet引用:
- 在Storyboard中,按住Control从
NSWindowController拖到CustViewController,创建关联 - 在代码中声明引用:
class YourWindowController: NSWindowController { @IBOutlet weak var custViewController: CustViewController! func triggerPrint() { custViewController.printCustomers(self) } }
方式三:通过通知中心触发(解耦场景)
如果不想直接持有CustViewController的引用,可以用通知中心来实现解耦:
- 在
CustViewController中注册通知:
override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(printCustomers(_:)), name: NSNotification.Name("TriggerPrintCustomers"), object: nil) } // 记得在deinit中移除通知 deinit { NotificationCenter.default.removeObserver(self) }
- 在
NSWindowController中发送通知:
class YourWindowController: NSWindowController { func triggerPrint() { NotificationCenter.default.post(name: NSNotification.Name("TriggerPrintCustomers"), object: self) } }
内容的提问来源于stack exchange,提问作者Eagle
相关产品推荐
相关产品推荐

