NSTableView Bindings无法运行mac OS Swift

时间:2017-06-18 19:57:42

标签: swift macos cocoa nstableview cocoa-bindings

我正在尝试使用nstableview的cocoa绑定,并且我遇到了textfield参数值绑定的一些问题:TextField Bindings

我正在使用此代码,类:

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)
}

我发现我无法将textfield绑定到我班级的任何变量 - 应用程序因bad_instruction错误而崩溃。

这是我对数组控制器和表视图的绑定: NSArrayController的: NSArrayController bindings

表视图: table view bindings

1 个答案:

答案 0 :(得分:3)

Cocoa Bindings建立在KVO之上。 KVO使用isa swizzling插入自动KVO通知的挂钩。

您必须将这些属性标记为动态,以便编译器不会优化对这些属性的调用。确保在运行时获取/设置这些属性将始终流经实例方法对于KVO机器的工作至关重要。

不将这些字段标记为动态似乎可行。在运行时设置绑定时,textfield将显式调用属性以获取要显示的初始值。但是对这些属性所做的任何更改都不会发送KVO通知,文本字段也不会更新。

如果您想对此进行正确测试,请将此代码添加到viewDidLoad

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

运行一次,看到表名视图在名称更改时不会更新。在dynamic上添加givenNamePerson并再次运行,验证表格视图更新。