2010-02-13 169 views
21

我已經設置了NSTextField,文本顏色爲白色,背景顏色爲(黑色,儘管未呈現背景顏色,因此透明)。全部在Interface Builder中。NSTextField - 黑色背景上的白色文本,但黑色光標

我遇到的問題是光標是黑色的,幾乎看不到光標不代表文字顏色嗎?任何想法如何解決這個問題?

否則,NSTextField看起來像不能編輯。

回答

16

你最好打賭的可能是使用NSTextView和- (void)setInsertionPointColor:(NSColor *)color

+2

號的最好的辦法是子類的NSTextField,如通過uliwitness描述下面。 – Bryan

11

假設您想要設置插入插入符的顏色而不是鼠標光標,那麼應該使用setInsertionPointColor:的建議。

但是,您不一定需要更改從使用NSTextFieldNSTextViewNSTextField所在的窗口的字段編輯器是NSTextView。因此,當您的NSTextField成爲關鍵視圖時,您可以獲取該字段編輯器並致電setInsertionPointColor:。當您的字段停止爲關鍵視圖時,您可能需要重置顏色。

您可以通過使用NSWindowfieldEditor:forObject:NSCellfieldEditorForView:來獲得現場編輯器。

如果您有NSTextField的子類,您可以讓它使用NSTextFieldCell的自定義子類並覆蓋-(NSText*)setUpFieldEditorAttributes:(NSText*)textObj。在該方法中,您可以設置插入點顏色一次,並且該字段編輯器在此文本字段中處於活動狀態時它將保留。儘管當字段編輯器移動到另一個編輯字段時,插入點顏色將保留,除非您重置它。

+0

酷,我不知道這工作。 –

+0

這是在NSSecureTextField上更改插入點顏色的絕妙方法。謝謝! –

+0

但'fieldEditor:forObject:'返回一個'NSText'對象。我不能在'NSText'上調用'setInsertionPointColor:'。 – JJD

2

受到Jon Steinmetz很好的回答的啓發,我創建了下面的例子。

我在應用程序視圖中添加了NSSecureTextField,並將它連接到我放入AppDelegate的成員變量的IBOutlet

@implementation AppDelegate 

@synthesize password = m_password; 

- (void)awakeFromNib { 
    assert(m_password); 
    self.password.backgroundColor = [NSColor blackColor]; 
} 

然後我創建了一個自定義NSSecureTextField類。我注意到在某些情況下不足以設置awakeFromNib中的顏色,但我無法給出原因。

@implementation CustomSecureTextField 

- (void)customize { 
    // Customize the text and caret color. 
    NSColor* foregroundColor = [NSColor whiteColor]; 
    self.textColor = foregroundColor; 
    [[self.cell fieldEditorForView:self] setInsertionPointColor:foregroundColor]; 
} 

- (void)awakeFromNib { 
    [self customize]; 
} 

- (void)textDidBeginEditing:(NSNotification*)notification { 
    // Called when the user inputs a character. 
    [self customize]; 
} 

- (void)textDidEndEditing:(NSNotification*)notification { 
    // Called when the user clicks into the field for the first time. 
    [self customize]; 
} 

- (void)textDidChange:(NSNotification*)notification { 
    // Just in case ... for the paranoid programmer! 
    [self customize]; 
} 


@end 

注:雖然,我不明白爲什麼背景顏色不能設置我這樣做在派生類像與textColor時。這將允許擺脫IBOutlet和成員變量。

+0

可能值得調用'super'的函數來執行你正在重寫的函數。 – Vince

26

由於在實踐中NSText *爲的NSTextField返回由-currentEditor始終是一個NSTextView *,我下面的代碼添加到我的自定義的NSTextField子類:

-(BOOL) becomeFirstResponder 
{ 
    BOOL success = [super becomeFirstResponder]; 
    if(success) 
    { 
     // Strictly spoken, NSText (which currentEditor returns) doesn't 
     // implement setInsertionPointColor:, but it's an NSTextView in practice. 
     // But let's be paranoid, better show an invisible black-on-black cursor 
     // than crash. 
     NSTextView* textField = (NSTextView*) [self currentEditor]; 
     if([textField respondsToSelector: @selector(setInsertionPointColor:)]) 
      [textField setInsertionPointColor: [NSColor whiteColor]]; 
    } 
    return success; 
} 

所以,如果你已經更換該類因爲你正在做自定義的背景繪製,這可能是一個更封裝的解決方案。也許還有一種方法可以將它提升到NSCell,因爲NSCell就是那個在繪圖並知道顏色的人。

+1

這應該確實被標記爲正確答案;使用'textDidBegin/end:'委託方法,如其他答案中所提出的,不會改變插入符的顏色,直到用戶開始輸入。這一個立即改變焦點。 – Bryan

+2

您可能希望添加相應的「 - (BOOL)resignFirstResponder」方法,該方法將顏色更改回黑色,因爲相應的字段編輯器由窗口中的所有文本字段共享。將其設置爲白色可能不是一個好主意,因爲其他字段不會自動將其設置爲黑色。 – Bryan

+0

請注意,resignFirstResponder在這種情況下不起作用,因爲當字段編輯器成爲第一響應者時,它將在becomeFirstResponder後立即調用。 –

24

文本字段插入點顏色

NSTextField *textField = self.textField; 
NSColor *insertionPointColor = [NSColor blueColor]; 

NSTextView *fieldEditor = (NSTextView*)[textField.window fieldEditor:YES 
                  forObject:textField]; 
fieldEditor.insertionPointColor = insertionPointColor; 
+2

完美無缺! –

+2

@Zelko Dvorak太棒了! – atomikpanda

+1

只要確保在viewDidAppear中調用它就會導致fieldEditor在viewDidLoad或viewWillAppear中仍然爲零 –

1

我在viewDidLoad和應用程序崩潰叫insertionPointColor

我通過致電insertionPointColorviewDidAppear解決了此問題。

對於夫特開發商:

集insertionPointColor方法成延伸:

extension NSTextField { 
    public func customizeCursorColor(_ cursorColor: NSColor) { 
     let fieldEditor = self.window?.fieldEditor(true, for: self) as! NSTextView 
     fieldEditor.insertionPointColor = cursorColor 
    } 
} 

和呼叫

override func viewDidAppear() { 
     super.viewDidAppear() 
     textField.customizeCursorColor(NSColor.red) 
    } 
相關問題