我已经在this之后以编程方式(仅限代码,没有XIB)构建了基于视图的NSTableView,它由NSArrayController支持,简单地由:var controller = NSArrayController()
创建并绑定到表中:
tableView.bind(NSContentBinding, toObject: controller, withKeyPath: "arrangedObjects", options: nil)
tableView.bind(NSSelectionIndexesBinding, toObject: controller, withKeyPath:"selectionIndexes", options: nil)
tableView.bind(NSSortDescriptorsBinding, toObject: controller, withKeyPath: "sortDescriptors", options: nil)
我只使用controller
方法添加/删除对象,并通过以下方式获取对象:(controller.arrangedObjects as! NSArray)[index]
。数组中的项目属于具有String?
或dynamic Double
字段的类,它们从NSObject
延伸。
在模型中添加和删除行会自动添加/删除表中的相应行,但我无法将单元格视图绑定到项目 - 并观察其字段中的更改。我试图关注this和this但没有运气。我的单元格视图的最终版本如下:
class PLTextCellView: NSTextField {
init(columnName:String) {
//.... erased...
self.columnName = columnName
}
var columnName = ""
var displayText:AnyObject {
get {
return stringValue
}
set(val) {
stringValue = String(val)
}
}
weak
var item:PLItem? = nil
override
var objectValue: AnyObject? {
didSet {
item = objectValue as? PLItem
if (item != nil) {
Swift.print("item to bind is:\(item) ")
unbind("displayText")
// bind("displayText", toObject: self.item!, withKeyPath: columnName, options: [NSNullPlaceholderBindingOption:"--"])
bind("displayText", toObject: self, withKeyPath: "objectValue."+columnName, options: [NSNullPlaceholderBindingOption:"--"])
} else {
Swift.print("unbinding... ")
unbind("displayText")
}
}
}
deinit {
unbind("displayText")
}
override
func prepareForReuse() {
unbind("displayText")
super.prepareForReuse()
}
///... erased ....
}
如果我不使用任何绑定,我只会在每个列的表格上显示 item
对象ID,即使我明确设置了{{1} (所以必须在内部设置文本!)
问题 1:如果我使用注释/第一displayText
行,则每个bind
对象会向控制台输出不同的对象ID - 即使某些对象代表相同的对象 - item
中没有一个存在!为什么?
问题 2:如果我使用未注释的/ controller
行,我会收到此错误:bind
。 This说我不应该在单元格视图中进行绑定/观察,但最方便的地方似乎是单元格视图(对于MVC)。我不知道如何删除An instance of ...item... was deallocated while key value observers were still registered with it.
中模型项中的所有-view-bindings。 (有趣的是,我甚至不删除deinit
中的任何项目)。
据我从相关问题和答案中了解,这个问题也适用于controller
。那么,绑定?