2017-06-18 99 views
1

我试图使用与NSTableView的可可绑定和我有一些问题文本框的参数值的绑定:TextField BindingsNSTableView的绑定不起作用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错误。

这里是我的阵列控制器和表视图的绑定: NSArrayController的: NSArrayController bindings

表视图: table view bindings

+0

重复的[Swift绑定不起作用Xcode 6 Beta 5](https://stackoverflow.com/questions/25269436/swift-bindings-wont-work-xcode-6-beta-5)? – Willeke

+0

我试图复制你的问题,但不能;在[我的项目](http://jmp.sh/28gdbW5)中,复制并粘贴代码并设置文档的绑定后,所有事情都按预期工作。 –

+0

@PaulPatterson你正在使用Xcode 9或Xcode 8? –

回答

1

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上添加dynamicgivenName并再次运行,验证表视图更新。

+0

问题依然存在:为什么它没有'动态'的工作。保罗帕特森和我尝试了伊格尔斯项目,它的工作原理。我编辑名称,日志'数组',名称已更改。 – Willeke

+0

就像我说的,没有动态的意味着KVO通知将不会被发送。当然你的数据仍然会改变。如果你重新加载tableview,它仍然会反映你的新值。 – pfandrade

+0

我编辑了回复,解释如何测试动态效果。 – pfandrade