2017年09月17日 19:19:44 lovechris00 阅读数:2060更多
所属专栏: macOS 开发
版权声明:本文为博主原创文章,转载请附上本文链接地址。from : https://blog.csdn.net/lovechris00 https://blog.csdn.net/lovechris00/article/details/78012495
文章目录
- 一、创建
- 二、特殊的 NSTextField -- Label
- 三、NSControlSubclassNotifications
- 四、NSControlTextEditingDelegate
- 五、样式
- 1、setFocusRingType 点击时外框的响应
- 2、nextKeyView 点击tab 聚焦到下一个field
- 3、取消响应
- 4、设置 placeholder 颜色
- 5、`10.14` 下光标、placeholder 不见了
- 6、多行显示不下时,最后一行显示省略号
- 7、NSTextField 与 cell
- 六、自定义光标等
- 1、需要创建继承自 NSSearchFieldCell 的子类,修改某些方法;
- 2、需要创建继承自 NSSearchField 的子类,实现下面方法来修改cell即可。
- 七、输入为密文:NSSecureTextField
- 八、参考资料
一、创建
- 比起 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];
1
2
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