2014-12-05 65 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() 
     }