2014-12-05 67 views
0

我已经使用IB进行了绑定,并且在基于视图的NSTableView中,我有两列,分别为FirstSecond,它们都有整数值。我需要能够比较它们,所以我可以更改它们的文本颜色,以便阅读。如何将基于视图的NSTableView的单元格值与Swift中的另一个单元格进行比较?

我有子类都一样,(除了一个是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! 

然后是错误信息,说我不能这样做,所以我wan't做这样的事情:

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做?

回答

0

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

一般来说,表视图应该绑定到阵列控制器的arrangedObjects,没有模型键路径。也就是说,表视图的每一行应该代表整个数组中的一个对象。然后,每个NSTableCellViewobjectValue将作为整体再次成为该对象。单元格视图中的子视图(例如文本字段)将通过模型键路径绑定到单元格视图,该路径将通过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属性取决于关键路径“objectValue.firstProperty”和“objectValue.secondProperty”。这将是+keyPathsForValuesAffecting<Key>的形式。

对于这种简单的情况,这似乎不值得。

+0

我有被绑定的ArrayController到ManagedObjectContext并从实体获取其数据。我的tableview是绑定到ArrayController等。它工作正常,并显示正确的数据(在真实的应用程序中,我有比在我的例子中更复杂的数据,但同样的问题) – Prontto 2014-12-05 10:10:22

+0

而且我也使用文本字段单元格视图的绑定。 – Prontto 2014-12-05 10:11:38

+0

谢谢你的回答,我现在想弄明白。 – Prontto 2014-12-05 10:19:40

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() 
     }