Привязки NSTableView не работают Mac OS Swift

Я пытаюсь использовать привязки какао с nstableview, и у меня есть некоторые проблемы с привязкой значения параметра textfield: Привязки TextField

Я использую этот код, класс:

class Person : NSObject {
var givenName:String
var familyName:String
var age = 0
var lol = 0

override init() {
    givenName = "given"
    familyName = "family"
    lol = 36
    super.init()
}

init(givenName:String, familyName:String, age:Int) {
    self.givenName = familyName
    self.familyName = givenName
    self.age = age
    self.lol = 36
    super.init()
} 

и просмотр контроллера:

class ViewController: NSViewController {

@IBOutlet weak var tableViewL: NSTableView!

@IBOutlet var superResultsController: NSArrayController!

@objc dynamic var array =  [Person]()


override func viewDidLoad() {
    super.viewDidLoad()
    array.append(Person(givenName: "sas", familyName: "gfg", age: 10))
    array.append(Person(givenName: "sddsgds", familyName: "gfg", age: 10))
    array.append(Person(givenName: "uoijh", familyName: "gfg", age: 10))
    print(superResultsController.arrangedObjects)
}

Я обнаружил, что не могу связать текстовое поле с какой-либо переменной моего класса - приложение вылетает с ошибкой bad_instruction.

Вот мои привязки контроллера массива и табличного представления: NSArrayController: NSArrayController bindingsпривязки табличного представления

1 ответ

Привязки какао строятся поверх КВО. И KVO использует isa swizzling для вставки хуков для автоматических уведомлений KVO.

Вы должны пометить эти свойства как динамические, чтобы компилятор не оптимизировал вызовы этих свойств. Убедиться в том, что во время выполнения получение / установка этих свойств всегда будут проходить через методы экземпляра, крайне важно для работы механизма KVO.

Не пометка этих полей как динамических может показаться работающей. Когда привязки устанавливаются во время выполнения, текстовое поле будет явно вызывать свойство, чтобы получить начальное значение для отображения. Но любые изменения, внесенные в эти свойства, не отправят уведомление KVO, и текстовое поле не будет обновлено.

Если вы хотите правильно проверить это, добавьте этот код в конец viewDidLoad:

DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
     self.array[0].givenName = "Some Name"
     NSLog("Changed the name")
}

Запустите один раз, убедитесь, что табличное представление не обновляется при изменении имени. Добавить dynamic в givenName на Person и запустите снова, проверьте обновления табличного представления.

Другие вопросы по тегам