2012-10-20 126 views
14

我有一個自定義NSTableCellView,包含3個文本框,1個來過,另外2個是我自己創建的。這裏的問題:
enter image description here自定義NSTableCellView標籤在選擇時不會更改文本顏色

即使我點擊該行textfields的文本顏色保持不變。我試圖實現一個我通過谷歌搜索發現的代碼,但它不起作用。我的自定義NSTableCellView代碼:

- (void)drawRect:(NSRect)dirtyRect{ 
    NSColor *color = [NSColor colorWithCalibratedRed:(26/255.0) green:(26/255.0) blue:(26/255.0) alpha:1.0]; 
    [self.textField setTextColor:color]; 

    color = [NSColor colorWithCalibratedRed:(102/255.0) green:(102/255.0) blue:(102/255.0) alpha:1.0]; 
    [_lbl1 setTextColor:color]; 
    [_lbl2 setTextColor:color]; 
} 

- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle { 
    NSColor *color = (backgroundStyle == NSBackgroundStyleDark) ? [NSColor windowBackgroundColor] : [NSColor controlShadowColor]; 
    self.textField.textColor = color; 
    self.lbl1.textColor = color; 
    self.lbl2.textColor = color; 
    [super setBackgroundStyle:backgroundStyle]; 
} 

我能做些什麼,使標籤的文本顏色爲白色,當用戶點擊他們?

+0

哪裏是文本框在他們的,都是標籤對嗎? – vishy

+0

是的,沒錯。改變了這個問題,以避免誤解 –

+0

只需使用'cellForRow'在'didSelect'中獲取單元格並設置單元格中標籤的顏色。 – vishy

回答

17

實際上,覆蓋NSTableViewCell上的setBackgroundStyle對我來說是完美的,至少在OS X 10.8上是這樣。它在選擇事件和窗口激活/停用時進行更新。

這裏是我的自定義單元格IMPL - 微不足道,因爲它可以得到:

@implementation RuntimeInstanceCellView 

- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle { 
    [super setBackgroundStyle:backgroundStyle]; 
    self.detailTextField.textColor = (backgroundStyle == NSBackgroundStyleLight ? [NSColor darkGrayColor] : [NSColor colorWithCalibratedWhite:0.85 alpha:1.0]); 
// self.detailTextField.textColor = (backgroundStyle == NSBackgroundStyleLight ? [NSColor blackColor] : [NSColor whiteColor]); 
} 

@end 
+0

爲什麼你叫'super: setBackgroundStyle'? –

+3

@DantheMan:首先,除非你有理由不這樣做,否則這是正確的(即默認)做法。其次,它設置默認文本字段的文本顏色,並可能設置背景顏色。 –

+0

這不適用於Swift 1.2因爲這個:http://stackoverflow.com/questions/28718577/issue-with-conforming-to-objective-c-protocol-from-swift-nsobject-subclass –

-5

在你tableViewSelectionDidChange得到使用

UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath]; //replace UITableViewCell with your customCell class name if it other 
//now as u got the instance of your cell u can modify the labels in it, like 
cell.lable1.textColor = [UIColor whiteColor]; 

這會爲你工作的細胞。

在此之後再次選擇其他單元時,您可能會遇到問題,此時以前的單元格可能仍有白色的標籤。如果這會導致問題,那麼只需在代表上一個選定索引路徑的頭類中有一個NSIndexPath實例,使用此實例可以在選擇新的單元格後重新設置爲默認顏色。

+0

btw,將'didSelectRowForIndexPath'改爲'tableViewSelectionDidChange'。 NSTableView沒有'didSelectRowForIndexPath'。 –

+0

好的,謝謝..我沒有開始開發Mac應用程序,所以.. – vishy

+2

有趣的是,UIKit代碼的答案已被標記爲正確,但問題是關於OS X/AppKit ... –

9

拓展上公認的答案,在雨燕2.0過程略有不同。重寫你的NSTableCellView子類的backgroundStyle屬性添加didSet property observer:(?是不是好玩)

class CustomTableCellView: NSTableCellView { 

    @IBOutlet weak var detailTextField: NSTextField! 

    override var backgroundStyle: NSBackgroundStyle { 
     didSet { 
      if self.backgroundStyle == .Light { 
       self.detailTextField.textColor = NSColor.controlTextColor() 
      } else if self.backgroundStyle == .Dark { 
       self.detailTextField.textColor = NSColor.alternateSelectedControlTextColor() 
      } 
     } 
    } 

} 
+0

坦克如此莫測! – Mike97

0

而對於斯威夫特3 & 4:

override var backgroundStyle: NSView.BackgroundStyle { 
    didSet { 
     if self.backgroundStyle == .light { 
      self.detailTextField.textColor = NSColor.controlTextColor 
     } else if self.backgroundStyle == .dark { 
      self.detailTextField.textColor = NSColor.alternateSelectedControlTextColor 
     } 
    } 
} 
相關問題