NSTableView的绑定不起作用MAC OS斯威夫特
问题描述:
我试图使用与NSTableView的可可绑定和我有一些问题文本框的参数值的绑定:NSTableView的绑定不起作用MAC OS斯威夫特
我使用这个代码,等级:
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错误。
答
Cocoa绑定是建立在志愿的顶部。 KVO使用isa swizzling为自动KVO通知插入挂钩。
您必须将这些属性标记为动态,以便编译器不会优化对这些属性的调用。确保在运行时获取/设置这些属性将始终流经实例方法,这对于KVO机器的工作至关重要。
不将这些字段标记为动态可能看起来有效。在运行时设置绑定时,文本字段将显式调用该属性以获取要显示的初始值。但对这些属性所做的任何更改都不会发送KVO通知,并且文本字段不会更新。
如果要正确测试此,代码添加到viewDidLoad
结束:
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.array[0].givenName = "Some Name"
NSLog("Changed the name")
}
运行一次,看到表视图不会更改名称时更新。在Person
上添加dynamic
到givenName
并再次运行,验证表视图更新。
重复的[Swift绑定不起作用Xcode 6 Beta 5](https://*.com/questions/25269436/swift-bindings-wont-work-xcode-6-beta-5)? – Willeke
我试图复制你的问题,但不能;在[我的项目](http://jmp.sh/28gdbW5)中,复制并粘贴代码并设置文档的绑定后,所有事情都按预期工作。 –
@PaulPatterson你正在使用Xcode 9或Xcode 8? –