我正在尝试将cocoa绑定与nstableview一起使用,在绑定textfield的参数值时遇到了一些问题:

我使用这段代码,class:
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:

表视图:

发布于 2017-06-20 21:19:18
可可绑定是建立在KVO之上的。KVO使用isa swizzling为自动KVO通知插入钩子。
您必须将这些属性标记为动态,以便编译器不会优化对这些属性的调用。确保在运行时,获取/设置这些属性将始终流经实例方法,这对于KVO机器的工作至关重要。
不将这些字段标记为动态似乎是可行的。在运行时设置绑定时,文本字段将显式调用该属性以获取要显示的初始值。但对这些属性所做的任何更改都不会发送KVO通知,文本字段也不会更新。
如果想要正确地测试这一点,请将以下代码添加到viewDidLoad的末尾
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
     self.array[0].givenName = "Some Name"
     NSLog("Changed the name")
}运行一次,可以看到表视图不会在名称更改时更新。将dynamic添加到Person上的givenName,然后再次运行,验证表视图更新。
https://stackoverflow.com/questions/44618988
复制相似问题