You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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引用:

  1. 在Storyboard中,按住Control从NSWindowController拖到CustViewController,创建关联
  2. 在代码中声明引用:
class YourWindowController: NSWindowController {
    @IBOutlet weak var custViewController: CustViewController!
    
    func triggerPrint() {
        custViewController.printCustomers(self)
    }
}

方式三:通过通知中心触发(解耦场景)

如果不想直接持有CustViewController的引用,可以用通知中心来实现解耦:

  1. 在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)
}
  1. 在NSWindowController中发送通知:
class YourWindowController: NSWindowController {
    func triggerPrint() {
        NotificationCenter.default.post(name: NSNotification.Name("TriggerPrintCustomers"), object: self)
    }
}

内容的提问来源于stack exchange,提问作者Eagle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:24:46