如何将基于视图的NSTableView单元格值与Swift中的另一个单元格进行比较?

时间:2014-12-05 09:38:41

标签: macos cocoa swift colors nstableview

我使用IB进行了绑定,在基于视图的NSTableView中,我有两列FirstSecond,它们都有整数值。我需要能够比较它们,所以我可以更改它们的文本颜色,以便更容易阅读。

我已经将这两个子类化了(除了另一个是FirstColumn

import Cocoa

class SecondColumn: NSTableCellView {

    override func drawRect(dirtyRect: NSRect) {
        super.drawRect(dirtyRect)

        // Here I Can change text color
        self.textField?.textColor = NSColor.redColor()

        // But I want be able to compare that textField value to my first column's value

    }
}

如果它的值小于第一列值,我希望只有第二列的文本为红色。所以我试图将IBOutlet设为SecondColumn类,如下所示:

@IBOutlet weak var firstColumn: FirstColumn!

然后会出现错误消息,说我无法做到这一点。所以我不会做这样的事情:

var secondValue = self.textField?.integerValue
var firstValue = // I don't know how i can get that?? 

if firstValue > secondValue {
        self.textField?.textColor = NSColor.redColor()
    } else {
        self.textField?.textColor = NSColor.greenColor()
    }

那么我怎么能做到这一点,无论如何都要在IB中做到这一点?

2 个答案:

答案 0 :(得分:0)

NSTableView的绑定是什么?您是否也在单元格视图中为文本字段使用绑定?如果是这样,什么绑定?

通常,表视图应绑定到没有模型键路径的数组控制器arrangedObjects。也就是说,表视图的每一行应该表示整个数组中的对象。然后,每个NSTableCellView' s objectValue将成为该对象,再次作为一个整体。单元格视图中的子视图(例如文本字段)将绑定到单元格视图,其中模型关键路径通过objectValue到对象的某个特定属性。

鉴于此,每个单元格视图都可以访问该行所表示的对象的所有属性。它有objectValue属性,即该对象。因此,单元格视图不必查询其子视图或其兄弟单元视图以获取对象的值。它只需使用其objectValue

所以,你可以做一些像(Objective-C):

MyModelClass* model = self.objectValue;
if (model.firstProperty < model.secondProperty)
    self.textField.textColor = [NSColor redColor];
else
    self.textField.textColor = [NSColor greenColor];

如果您想在IB中执行此操作,则需要将文本字段的文本颜色绑定绑定到单元格视图,模型关键路径objectValue。然后,您将创建一个值转换器类(NSValueTransformer的子类),它将模型对象转换为颜色,基本上通过比较这两个属性。您要配置绑定以使用该值转换器。

或者,您可以在SecondColumn类上实现一个属性,该属性返回基于objectValue的颜色,您可以绑定到该属性。在这种情况下,你不需要价值转换器。您需要实现正确的方法,让KVO /绑定知道color属性取决于关键路径&#34; objectValue.firstProperty&#34;和&#34; objectValue.secondProperty&#34;。这将是+keyPathsForValuesAffecting<Key>

的形式

对于这个简单的案例,它看起来并不值得。

答案 1 :(得分:0)

谢谢你,那个objectValue很容易。我只创建了NSTableCellView的一个子类,并从中获取所需的值。例如,假设我有实体Person,其属性为bankAccountcash,我将ArrayController绑定到managedObjectContext和NSTableView等。我的类看起来像这样:

        // Drawing code here.
        var obj = self.objectValue as Person
        var bankA = obj.bankAccount
        var sumOfCash = obj.cash

        if Double(bankA) > Double(sumOfCash) {
            self.textField?.textColor = NSColor.greenColor()
        } else {
            self.textField?.textColor = NSColor.redColor()
        }