首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSTableView绑定无法在mac OS Swift上运行

NSTableView绑定无法在mac OS Swift上运行
EN

Stack Overflow用户
提问于 2017-06-19 03:57:42
回答 1查看 825关注 0票数 2

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

我使用这段代码,class:

代码语言:javascript
运行
复制
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()
} 

和视图控制器:

代码语言:javascript
运行
复制
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:

表视图:

EN

回答 1

Stack Overflow用户

发布于 2017-06-20 21:19:18

可可绑定是建立在KVO之上的。KVO使用isa swizzling为自动KVO通知插入钩子。

您必须将这些属性标记为动态,以便编译器不会优化对这些属性的调用。确保在运行时,获取/设置这些属性将始终流经实例方法,这对于KVO机器的工作至关重要。

不将这些字段标记为动态似乎是可行的。在运行时设置绑定时,文本字段将显式调用该属性以获取要显示的初始值。但对这些属性所做的任何更改都不会发送KVO通知,文本字段也不会更新。

如果想要正确地测试这一点,请将以下代码添加到viewDidLoad的末尾

代码语言:javascript
运行
复制
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
     self.array[0].givenName = "Some Name"
     NSLog("Changed the name")
}

运行一次,可以看到表视图不会在名称更改时更新。将dynamic添加到Person上的givenName,然后再次运行,验证表视图更新。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44618988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档