我使用IB进行了绑定,在基于视图的NSTableView中,我有两列First
和Second
,它们都有整数值。我需要能够比较它们,所以我可以更改它们的文本颜色,以便更容易阅读。
我已经将这两个子类化了(除了另一个是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中做到这一点?
答案 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
,其属性为bankAccount
和cash
,我将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()
}