Swift на панели предпочтений, с привязками какао; Что я делаю неправильно?
Я пытаюсь сделать клон RCDefaultApp, потому что это было отличное приложение, и, к сожалению, Сьерра убила его.
Большая часть бэкенда сделана; Я экспериментирую с интерфейсом, и должно быть что-то (или множество вещей), я делаю неправильно. Я пытался следовать нескольким различным учебникам, более или менее к письму, и я просто не могу воспроизвести ожидаемые результаты.
Это владелец файла моей предпочтительной панели:
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. Если я пытаюсь привязать к самому виду таблицы, у меня та же проблема. Если я пытаюсь привязать столбец, он действительно работает (хотя по какой-то причине он настаивает на том, что мне нужно использовать NSString; даже String не работает), КРОМЕ этого выглядит так: