【问题标题】:NSTableView Bindings doesn't work mac OS SwiftNSTableView 绑定不起作用 mac OS Swift
【发布时间】:2017-06-18 19:57:42
【问题描述】:

我正在尝试将可可绑定与 nstableview 一起使用,但我在绑定 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)
}

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

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

表格视图:

【问题讨论】:

  • 我试图复制您的问题,但不能;在my project 中,复制并粘贴您的代码并设置您记录的绑定后,一切都按预期工作。
  • @PaulPatterson 您使用的是 Xcode 9 还是 Xcode 8?
  • @PaulPatterson 我正在使用 Xcode 9 和 swift 4,也许是这样
  • @Willeke,看来我的帖子确实是重复的,不幸的是我在搜索时没有找到它。我用 objc dynamic 标记了类中的属性,它可以工作。但我仍然不明白为什么我必须用 objc dynamic 标记属性而有人不必这样做。

标签: swift macos cocoa nstableview cocoa-bindings


【解决方案1】:

Cocoa 绑定建立在 KVO 之上。 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 并再次运行,验证表视图更新。

【讨论】:

  • 问题仍然存在:为什么没有dynamic 也能工作。 Paul Patterson 和我尝试了 Igors 项目并且它有效。我编辑了一个名字,登录array,名字变了。
  • 就像我说的,没有动态意味着不会发送 KVO 通知。当然,您的数据仍然会发生变化。如果您重新加载 tableview,它仍然会反映您的新值。
  • 我已经编辑了解释如何测试动态效果的响应。
  • 好的,数组中的名称发生了变化,但我没有反过来测试。
猜你喜欢
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2013-10-04
  • 2012-05-14
  • 2016-07-14
  • 2012-12-08
  • 1970-01-01
相关资源
最近更新 更多