我有一个绑定到NSArrayController的tableview。 ArrayController从数组[NSObject]
中获取数据:
class Fruits : NSObject {
var name:String
var price:Double
// If I set 'isBold = true' here manually,
//the font in my tableview becomes bold (from start of the application).
dynamic var isBold = false {
didSet {
print(isBold)
}
}
override init() {
name = "name"
price = 0.0
}
init(name:String, price:Double) {
self.name = name
self.price = price
}
}
只要我手动设置“.sold”值,一切正常。
如果我在ViewController中调用:
Fuits.init().isBold = true
tableView.reloadData()
打印正确的“.sold”值,但在表格视图中没有任何变化。任何想法为什么ArrayController没有注意到更新的值?
编辑:
我找到了一种工作方式。但也许只是暗示为什么它不像上面那样工作。这个解决方案适用于迭代,我不认为它应该如何。
func changeBold(bold: Bool) {
if bold == false {
self.dataArray.forEach { fruit in
fruit.isBold = false
} else {
self.dataArray.forEach { fruit in
fruit.isBold = true
}
}
}
答案 0 :(得分:0)
编辑:我误解了你所写的内容。我认为绑定设置面板用于表视图,而不是表格单元格视图。你写的其他内容对我来说更有意义。
您的行Fruits.init().isBold = true
在语法方面有点奇怪,但更重要的一点是您正在创建Fruits
的新实例并设置其粗体属性但不对该实例执行任何操作,所以它一旦超出范围就会消失。您需要更改存储在单元视图的objectValue
属性中的实例的属性(因为这是由单元视图表示的绑定机制设置的实例)。
另外,请注意“编辑控制器后面的对象”通常也会导致UI中没有出现更改的症状。示例:如果直接从数组中删除Fruits
的实例,则必须告诉数组控制器刷新以查看更改(可能会丢失表中的选择和滚动信息或某些其他UI状态) 。相反,您应该访问阵列控制器的 arrangedObjects
属性并删除/添加/插入,以便阵列控制器“了解”这些更改。您需要阅读有关绑定机制的更多内容,以了解何时/为何通过控制器直接进行更改,但这是Cocoa绑定的一个方面,您必须知道。< / p>