文章目錄
一、創建
- 比起 UITextField 可以輸入多行
- (void)addTextField{
NSTextField *field0 = [[NSTextField alloc]initWithFrame:NSMakeRect(100, 100, 100, 100)];
[self.window.contentView addSubview:field0];
field0.backgroundColor = [NSColor cyanColor];
field0.textColor = [NSColor magentaColor];
field0.bordered = NO;//無邊框
field0.delegate = self;
}
二、特殊的 NSTextField – Label
文章請戳這裏:
http://blog.csdn.net/lovechris00/article/details/77977541
三、NSControlSubclassNotifications
- 這裏的三個方法,跟 UITextField 代理中常用的三個方法。不用同意代理就可以執行,這個挺好:
#pragma mark - NSControlSubclassNotifications
- (void)controlTextDidBeginEditing:(NSNotification *)obj {
NSTextField *field = obj.object;
NSLog(@"controlTextDidBeginEditing : %@",field.stringValue);
}
- (void)controlTextDidEndEditing:(NSNotification *)obj {
NSTextField *field = obj.object;
NSLog(@"controlTextDidEndEditing : %@",field.stringValue);
}
- (void)controlTextDidChange:(NSNotification *)obj {
NSTextField *field = obj.object;
NSLog(@"controlTextDidChange : %@",field.stringValue);
}
四、NSControlTextEditingDelegate
#pragma mark - NSControlTextEditingDelegate
//點擊 field 並準備輸入第一個字母時。
- (BOOL)control:(NSControl *)control textShouldBeginEditing:(NSText *)fieldEditor{
return YES;
}
//不再填寫這個 field(如:去填寫另外一個 field 的時)調用。如果文字沒有改變,就不會調用。
- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor{
return YES;
}
//輸入文字後,在 EndEditing 之前調用。如果文字沒有改變,就不會調用。
//返回 NO 時,這個窗口不會響應其他的點擊事件(不能去填別的)。
- (BOOL)control:(NSControl *)control isValidObject:(nullable id)obj{
return YES;
}
響應在NSTextField裏按回車鍵
//被其他方法調用時,如:點擊 delete 按鈕,commandSelector 爲 deleteBackward:. tab:insertTab: 。
//返回 YES 時,delete、tab 這些方法調用失敗。所以需要返回 NO。
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector{
// NSLog(@"commandSelector : %@",NSStringFromSelector(commandSelector));
/*
moveLeft:
moveDown:
moveUp:
moveRight:
insertTab:
control、option、command 都不行
*/
//點擊換行,提交代碼
if ([NSStringFromSelector(commandSelector) isEqualToString:@"insertNewline:"]) {
[self requestCheckUser];
return YES;
}
return NO;
}
- (BOOL)control:(NSControl *)control didFailToFormatString:(NSString *)string errorDescription:(nullable NSString *)error{
return YES;
}
- (void)control:(NSControl *)control didFailToValidatePartialString:(NSString *)string errorDescription:(nullable NSString *)error{
NSLog(@"didFailToValidatePartialString : %@",string);
}
- (NSArray<NSString *> *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray<NSString *> *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index{
NSLog(@"completions : %@",words);
return words;
}
其實,我不知道最後三個方法怎麼用。。。。。
五、樣式
1、setFocusRingType 點擊時外框的響應
去掉點擊時外框的響應
[self setFocusRingType:NSFocusRingTypeNone];
2、nextKeyView 點擊tab 聚焦到下一個field
lastField.nextKeyView = field;
3、取消響應
[self.window makeFirstResponder:0];
注意:
resignFirstResponder 沒有用
4、設置 placeholder 顏色
沒有 placeholderColor 這個屬性,使用iOS KVC 的方式好像也不可行。
但我們可以發現 setPlaceholderAttributedString 這個方法。測試之後確實有效。
這裏寫個分類方法。
- (void)msSetPlaceholder:(NSString *)placeholder color:(NSColor*)color{
if(color ==nil) {
color = RGB(224, 224, 224);
}
NSFont *font = self.font;
NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys:font,
NSFontAttributeName,
color,
NSForegroundColorAttributeName,
nil];
NSAttributedString* attributedString = [[NSAttributedString alloc] initWithString:placeholder attributes:attrs];
[self setPlaceholderAttributedString:attributedString];
}
5、10.14
下光標、placeholder 不見了
其實不是光標不見了,只是顏色是白色。
placeholder 可以使用上述方法(設置 setPlaceholderAttributedString)來設置。
光標可以參考第六大點,自定義光標。
6、多行顯示不下時,最後一行顯示省略號
[[field cell] setLineBreakMode:NSLineBreakByCharWrapping];
[[field cell] setTruncatesLastVisibleLine:YES];
7、NSTextField 與 cell
現NSTextField是繼承於NSControl的,在NSControl中有一個屬性爲cell。
@property (nullable, strong) __kindof NSCell *cell;
也就是說在NSTextField控件上,除了有自己的邊框外,還有一個繼承於父類的NSCell,所以在我們設置NSTextField的邊框顏色時需要同時設置NSCell的相應屬性。
cell 是 cocoa 在當時硬件條件下的一種優化。cocoa 是利用顯卡3d 加速能力的 GUI 框架。
六、自定義光標等
參考(內附demo):http://www.tanhao.me/pieces/1580.html/
記住區別 NSTextField 的 cell 繼承自 NSTextFieldCell, NSSearchField 的 cell 繼承自 NSSearchFieldCell;NSSecureTextField 的 cell 繼承自 NSSecureTextFieldCell;
這裏以 NSSearchField 爲例。
1、需要創建繼承自 NSSearchFieldCell 的子類,修改某些方法;
//通過代碼實例化
- (id)init
{
self = [super init];
if (self)
{
[self setUp];
}
return self;
}
//通過xib實例化
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
[self setUp];
}
return self;
}
- (void)setUp
{
//可以寫你需要的設置
}
//重寫該方法實現對光標顏色的修改
// NSSearchField獲取焦點,要顯示光標的時候,都會調用該方法。
- (NSText *)setUpFieldEditorAttributes:(NSText *)textObj
{
NSText *text = [super setUpFieldEditorAttributes:textObj];
[(NSTextView*)text setInsertionPointColor:[NSColor whiteColor]];
return text;
}
2、需要創建繼承自 NSSearchField 的子類,實現下面方法來修改cell即可。
+ (void)setCellClass:(Class)factoryId
{
[super setCellClass:[THSearchFieldCell class]];
}
+ (Class)cellClass
{
return [THSearchFieldCell class];
}
七、輸入爲密文:NSSecureTextField
https://blog.csdn.net/abby_sheen/article/details/7386308
八、參考資料
-
TH:自定義NSSearchFiled樣式
http://www.tanhao.me/pieces/1580.html/ -
用NSSecureTextField和NSTextField重疊實現可見輸入的密碼
https://blog.csdn.net/abby_sheen/article/details/7386308