我已經設置了NSTextField
,文本顏色爲白色,背景顏色爲(黑色,儘管未呈現背景顏色,因此透明)。全部在Interface Builder中。NSTextField - 黑色背景上的白色文本,但黑色光標
我遇到的問題是光標是黑色的,幾乎看不到。 光標不代表文字顏色嗎?任何想法如何解決這個問題?
否則,NSTextField
看起來像不能編輯。
我已經設置了NSTextField
,文本顏色爲白色,背景顏色爲(黑色,儘管未呈現背景顏色,因此透明)。全部在Interface Builder中。NSTextField - 黑色背景上的白色文本,但黑色光標
我遇到的問題是光標是黑色的,幾乎看不到。 光標不代表文字顏色嗎?任何想法如何解決這個問題?
否則,NSTextField
看起來像不能編輯。
你最好打賭的可能是使用NSTextView和- (void)setInsertionPointColor:(NSColor *)color
。
假設您想要設置插入插入符的顏色而不是鼠標光標,那麼應該使用setInsertionPointColor:
的建議。
但是,您不一定需要更改從使用NSTextField
到NSTextView
。 NSTextField
所在的窗口的字段編輯器是NSTextView
。因此,當您的NSTextField
成爲關鍵視圖時,您可以獲取該字段編輯器並致電setInsertionPointColor:
。當您的字段停止爲關鍵視圖時,您可能需要重置顏色。
您可以通過使用NSWindow
的fieldEditor:forObject:
或NSCell
的fieldEditorForView:
來獲得現場編輯器。
如果您有NSTextField的子類,您可以讓它使用NSTextFieldCell的自定義子類並覆蓋-(NSText*)setUpFieldEditorAttributes:(NSText*)textObj
。在該方法中,您可以設置插入點顏色一次,並且該字段編輯器在此文本字段中處於活動狀態時它將保留。儘管當字段編輯器移動到另一個編輯字段時,插入點顏色將保留,除非您重置它。
酷,我不知道這工作。 –
這是在NSSecureTextField上更改插入點顏色的絕妙方法。謝謝! –
但'fieldEditor:forObject:'返回一個'NSText'對象。我不能在'NSText'上調用'setInsertionPointColor:'。 – JJD
受到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
和成員變量。
可能值得調用'super'的函數來執行你正在重寫的函數。 – Vince
由於在實踐中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就是那個在繪圖並知道顏色的人。
這應該確實被標記爲正確答案;使用'textDidBegin/end:'委託方法,如其他答案中所提出的,不會改變插入符的顏色,直到用戶開始輸入。這一個立即改變焦點。 – Bryan
您可能希望添加相應的「 - (BOOL)resignFirstResponder」方法,該方法將顏色更改回黑色,因爲相應的字段編輯器由窗口中的所有文本字段共享。將其設置爲白色可能不是一個好主意,因爲其他字段不會自動將其設置爲黑色。 – Bryan
請注意,resignFirstResponder在這種情況下不起作用,因爲當字段編輯器成爲第一響應者時,它將在becomeFirstResponder後立即調用。 –
NSTextField *textField = self.textField;
NSColor *insertionPointColor = [NSColor blueColor];
NSTextView *fieldEditor = (NSTextView*)[textField.window fieldEditor:YES
forObject:textField];
fieldEditor.insertionPointColor = insertionPointColor;
完美無缺! –
@Zelko Dvorak太棒了! – atomikpanda
只要確保在viewDidAppear中調用它就會導致fieldEditor在viewDidLoad或viewWillAppear中仍然爲零 –
我在viewDidLoad
和應用程序崩潰叫insertionPointColor
。
我通過致電insertionPointColor
對viewDidAppear
解決了此問題。
對於夫特開發商:
集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)
}
號的最好的辦法是子類的NSTextField,如通過uliwitness描述下面。 – Bryan