1

我正在尝试克隆 RCDefaultApp,因为它是一个很棒的应用程序,遗憾的是 Sierra 杀死了它。

大部分后端已完成;我正在试验界面,一定有一些(或许多事情)我做错了。我已经尝试过几个不同的教程,或多或少是信的,但我无法重现预期的结果。

这是我的偏好窗格的文件所有者:

import PreferencePanes

class SWDAMainPrefPane: NSPreferencePane {
    var schemesList = SchemesModel().value(forKey:"allSchemes") as! NSObject
    var internetSchemes = SchemesModel().internetSchemes
    override func mainViewDidLoad() {
        super.mainViewDidLoad()

    }
}

class SchemesModel: NSObject {
    var internetSchemes: NSObject {
        get {
        var schemes: [Scheme] = []
        var data = ["http":"Web Browser","mailto":"E-Mail","news":"News","rss":"RSS","ftp":"FTP","im":"Instant Messaging"]
        for (index, scheme) in data.enumerated() {
            schemes.append(Scheme(schemeName: scheme.key, description: scheme.value))
        }
        return schemes as! NSObject
        }
        set {}
    }
    var allSchemes: NSObject {
        get {
        var schemes = [Scheme]()
        if let schemesHandlers = LSWrappers.Schemes().copySchemesAndHandlers() {
            for scheme in Array(schemesHandlers.keys) {

                schemes.append(Scheme.init(schemeName: scheme))
            }
            NSLog(String(describing:schemes))
            return schemes as! NSObject
        }
        else { return [] as! NSObject }
        }
        set {}
    }
}

class Scheme: NSObject {
    init (schemeName: String, description: String? = nil) {

        super.init()
        self.setValue(schemeName, forKey: "schemeName")
        if let description = description {

            self.setValue(description, forKey: "schemeDescription")

        }
        else {

                self.setValue(self.getDescription(), forKey: "schemeDescription")
        }

    }
    var wrappedName: NSObject {
        get {
        return self.schemeName as! NSObject
        }
        set {}
    }
    var wrappedDescription: NSObject {
        get {
            return self.schemeDescription as! NSObject
        }
        set {}
    }
    var schemeName: NSString = ""
    var schemeDescription: NSString = ""

    func getDescription () -> NSString {

        if let schemeDescription = LSWrappers.Schemes().getNameForScheme(self.schemeName as String) {
            self.setValue(schemeDescription, forKey: "schemeDescription")
            return self.schemeDescription
        }
        else { return "" }
    }
}

最初,我试图将数据转储到 NSBrowser 中,但我绝对无法让它工作;总是在运行时因“无法识别的选择器发送到实例......”错误而崩溃,即使我确定一切都正确连接。

包装的属性在那里,因为浏览器希望我绑定到 NSObject。

然后我尝试使用 NSTableView。如果我尝试绑定到 tableview 本身,我会遇到同样的问题。如果我尝试绑定到 Column,它实际上似乎可以工作(尽管由于某种原因它坚持我需要使用 NSString;甚至 String 都不能工作)除了它看起来像这样:

PreferencePane 看起来像……什么?

这是我的阵列控制器的样子。 阵列控制器属性 数组控制器绑定

这是表视图绑定。 Tableview 列绑定

4

0 回答 0