NSArrayController:不更新粗体属性

时间:2017-07-22 15:48:06

标签: arrays swift cocoa binding nsarraycontroller

我有一个绑定到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没有注意到更新的值?

enter image description here

编辑:

我找到了一种工作方式。但也许只是暗示为什么它不像上面那样工作。这个解决方案适用于迭代,我不认为它应该如何。

func changeBold(bold: Bool) {

        if bold == false {
            self.dataArray.forEach { fruit in
                fruit.isBold = false
            } else {
                self.dataArray.forEach { fruit in
                    fruit.isBold = true
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

编辑:我误解了你所写的内容。我认为绑定设置面板用于表视图,而不是表格单元格视图。你写的其他内容对我来说更有意义。

您的行Fruits.init().isBold = true在语法方面有点奇怪,但更重要的一点是您正在创建Fruits的新实例并设置其粗体属性但不对该实例执行任何操作,所以它一旦超出范围就会消失。您需要更改存储在单元视图的objectValue属性中的实例的属性(因为这是由单元视图表示的绑定机制设置的实例)。

另外,请注意“编辑控制器后面的对象”通常也会导致UI中没有出现更改的症状。示例:如果直接从数组中删除Fruits的实例,则必须告诉数组控制器刷新以查看更改(可能会丢失表中的选择和滚动信息或某些其他UI状态) 。相反,您应该访问阵列控制器的 arrangedObjects属性并删除/添加/插入,以便阵列控制器“了解”这些更改。您需要阅读有关绑定机制的更多内容,以了解何时/为何通过控制器直接进行更改,但这是Cocoa绑定的一个方面,您必须知道。< / p>