【问题标题】:NSArrayController: Doesn't update bold attributeNSArrayController:不更新粗体属性
【发布时间】:2017-07-22 15:48:06
【问题描述】:

我有一个绑定到 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
    }

}

所以只要我手动设置 ìsBold` 值,一切都会正常工作。

如果我调用 ViewController:

Fuits.init().isBold = true
tableView.reloadData()

打印了正确的ìsBold`值,但在tableview中没有任何变化。任何想法为什么 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
            }
        }
    }

【问题讨论】:

    标签: arrays swift cocoa binding nsarraycontroller


    【解决方案1】:

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

    你的Fruits.init().isBold = true 行在语法上有点奇怪,但更重要的是你正在创建一个Fruits 的新实例并设置它的粗体属性但没有对实例做任何事情,所以它消失了一旦超出范围。您需要更改存储在单元格视图的 objectValue 属性中的实例的属性(因为这是由您的单元格视图表示的绑定机制设置的实例)。

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

    【讨论】:

    • 我将控制器的对象类设置为Fruits,否则表格视图将不会被填充。我不完全理解您对 arrangedObjects 控制器的意思。是不是跟我图片上的一样装订不对?
    • 我找到了一种方法,但我认为这不是正确的方法。见编辑。
    • 您的编辑工作仅因为您在阵列控制器中对 Fruits 的实际实例进行操作。
    • 那么有更好的解决方案吗?我必须承认我真的不知道如何实施你的建议。
    • 你有一些阅读要做。无论如何,Fruits.init... 的两行示例仅创建一个临时对象,对其进行更改,然后让它消失;您的第二次更新适用于由表格单元格视图表示的集合中的实例。你不能随机创建一些“人”,设置它的名字,杀死它,然后指望站在那里的人突然随机地拥有那个人的名字。理解?如果您想重命名该组中的一个人,请抓住该人并命名他/她。
    猜你喜欢
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多