我正在尝试使用nstableview的cocoa绑定,并且我遇到了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)
}
我发现我无法将textfield绑定到我班级的任何变量 - 应用程序因bad_instruction错误而崩溃。
答案 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
上添加givenName
到Person
并再次运行,验证表格视图更新。