swift - OSX : Delegating between a NSWindowController and a NSViewController

标签 swift macos appdelegate swift-protocols

这里简化了我的问题。我有一个工具栏,窗口中有一个按钮, View 中有一个标签。单击按钮时,我想让 label.stringValue 从“ON”变为“OFF”

这是窗口 Controller :

protocol ViewControllerDelegate {
    func switchOnOff()
}

class WindowController: NSWindowController {
    var viewDelegate: ViewControllerDelegate?
    @IBAction func pressedButton(_ sender: Any) {
        var vc = storyboard?.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "ViewController")) as? ViewController
        vc?.switchOnOff()
    }    
    override func windowDidLoad() {
        super.windowDidLoad()
    }
}

这是 View Controller :

class ViewController: NSViewController {
    @IBOutlet weak var onOffLabel: NSTextField!
    override func viewDidLoad() {
        super.viewDidLoad()
        let vc = WindowController()
        vc.viewDelegate = self    }

    override var representedObject: Any? {
        didSet {
        }
    }
}

extension ViewController: ViewControllerDelegate {
func switchOnOff() {
    if (onOffLabel.stringValue == "OFF" ) {
        onOffLabel.stringValue = "ON"
    } else {
        onOffLabel.stringValue = "OFF"
    }       
}

这是 Storyboard: enter image description here

当我点击按钮时出现这个错误:

extension ViewController: ViewControllerDelegate {
    func switchOnOff() {
        if (onOffLabel.stringValue == "OFF" ) { // Thread 1: Fatal error: Unexpectedly found nil while unwrapping 
        an Optional value
            onOffLabel.stringValue = "ON"
        } else {
            onOffLabel.stringValue = "OFF"
        }
    }
}

最佳答案

我希望这个答案还不算太晚。

委托(delegate)的工作方式是您告诉发件人要发送给谁。您遇到的问题是您创建了一个新的 WindowController 实例并将其注册为接收者。问题是 WindowController 的新实例不是发送按钮点击操作的实例。

要使其正常工作,您必须将 ViewController 注册到 WindowController 的唯一实例。

而不是做

let vc = WindowController()
vc.viewDelegate = self

您需要找到实际的 Window Controller 实例并注册到该实例。将上面的代码改成:

(self.view.window?.windowController as! WindowController).delegate = self

一切都应该完美无缺。

关于swift - OSX : Delegating between a NSWindowController and a NSViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52215402/

相关文章:

c - 通过 C API 加载内核扩展?

xcode - 模态表在应用程序中无法工作已完成启动吗?

c++ - 使用 MacPorts 在 OSX 10.6 上安装 OpenCV

ios - 何时/什么/为什么/如何在应用程序中使用 launchOptions 的 UIApplicationOptionsURLKey 值(应用程序 :willFinishLaunchingWithOptions:)?

ios - 在 Swift 中不是初始的主从 View

swift - Swift 中的重载方法会导致 Objective C 错误

ios - 为什么double类型的主窗口是可选的?

swift - 表格 View : get value of textField in HeaderCell

ios - 第一次未设置 UITableview 单元格标签字体大小

objective-c - Cocoa 应用程序 - XCode 8 和 App Delegate