【问题标题】:Having issues passing a delegate from NSWindowController subclass to my ViewController将委托从 NSWindowController 子类传递到我的 ViewController 时遇到问题
【发布时间】:2018-12-28 20:53:11
【问题描述】:

我在将自定义协议 (MainWindowControllerProtocol) 从 MainWindowController 传递到 EditorViewController 时遇到问题,MainWindowController 是 NSWindowController 的子类。请帮忙。

EditorViewController.swift

extension EditorViewController: MainWindowControllerProtocol {
    func didOpenFile() {
        print("TODO: Open File") // never called, but it should be
    }
}

class EditorViewController: NSViewController {
    // - IBOutlets
    @IBOutlet weak var treeOutlineView: NSOutlineView!
    @IBOutlet var codeTextView: NSTextView!

    @IBOutlet weak var counterTextField: NSTextField!
    @IBOutlet weak var languageTextField: NSTextField!

    //public var editor = Editor()
    //var rootNode: Node?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do view setup here.

        //rootNode = Path(Path.userDownloads).node

        // Issue is here
        if let windowController = NSApplication.shared.mainWindow?.windowController as? MainWindowController {
            windowController.delegate = self
        }
        else {
            print("Doesnt work") // prints this
        }

        //treeOutlineView.reloadData()
    }
}

MainWindowController

public protocol MainWindowControllerProtocol {
    func didOpenFile()
}

class MainWindowController: NSWindowController {

    var delegate: MainWindowControllerProtocol?

    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.
    }
    @IBAction func openFile(_ sender: Any) {
        print("In here") // this is called?
        delegate?.didOpenFile() // but this never is apparently
    }

}

【问题讨论】:

  • 你如何呈现MainWindowController
  • MainWindowController 似乎没有在 EditorViewController 内部实例化。当你实例化它时,你可以将它的委托设置为self’

标签: swift cocoa delegates protocols nswindowcontroller


【解决方案1】:

也许this topic 应该会有所帮助。

如果应用程序的 nib 文件没有,此方法可能会返回 nil 完成加载,如果接收器未激活,或者如果应用程序 被隐藏了。

您是否检查过 NSApplication.shared.mainWindow 是否为 nil 或只是 NSApplication.shared.mainWindow?.windowController 不能强制转换为您的控制器类?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    相关资源
    最近更新 更多