【问题标题】:How to pass data from NSWindowController to its NSViewController?如何将数据从 NSWindowController 传递到其 NSViewController?
【发布时间】:2015-03-07 16:06:02
【问题描述】:

我的NSWindowController 类中有一个NSToolBar 按钮的IBOutlet,这是我的主窗口类:

class MainWindowController: NSWindowController {

    @IBOutlet weak var myButton: NSButton!

    // ...
}

我有一个类MainViewController,即主窗口的内容NSViewController

如何在我的内容NSViewController 中访问此按钮?有没有更好的方法来组织IBOutlets 和控制器以促进这种访问?

【问题讨论】:

  • 您应该尝试创建一个新项目并取消选择“使用情节提要”。它会让你的生活轻松 10 倍
  • 从您的视图控制器中引用您的窗口控制器对象。您可以通过窗口控制器访问您的按钮。
  • 按钮通常不属于窗口控制器。如果你的窗口控制器需要响应一些变化,那可以更好地解耦。

标签: macos cocoa swift


【解决方案1】:

从 NSWindowController 访问 NSViewController:

let viewController:MainViewController = self.window!.contentViewController as! MainViewController

从 NSViewController 访问 NSWindowController:

let windowController:MainWindowController = self.view.window?.windowController as! MainWindowController

【讨论】:

  • 如果你最终还是要强制解包,那么有条件地链接是没有意义的。 self.window!.contentViewController as! MainVC
  • 自 Swift v2.1 以来可选链接没有改变
  • 这些解决方案不好。当应用处于非活动状态时,窗口为 nil,应用崩溃。
  • 把它设为可选并检查是否不为零
【解决方案2】:

这样使用委托怎么样?此示例将更改按钮的标题。

@objc protocol SomeDelegate {
    func changeTitle(title: String)
}

class ViewController: NSViewController {

    weak var delegate: SomeDelegate?

    @IBAction func myAction(sender: AnyObject) {
        delegate?.changeTitle("NewTitle")
    }

}

class MainWindowController: NSWindowController, SomeDelegate {

    @IBOutlet weak var myButton: NSButton!

    override func windowDidLoad() {
        super.windowDidLoad()

        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
        let myVc = window!.contentViewController as! ViewController
        myVc.delegate = self

    }

    func changeTitle(title: String) {
        myButton.title = title
    }

}

【讨论】:

    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多