zoukankan      html  css  js  c++  java
  • oc之mac

    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;

        

    }

    pastedGraphic.png

    二、特殊的 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;

    }

    其实,我不知道最后三个方法怎么用。。。。。

    五、样式

    1setFocusRingType 点击时外框的响应

    去掉点击时外框的响应

    [self setFocusRingType:NSFocusRingTypeNone];

    2nextKeyView 点击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];

        

    }

    510.14下光标、placeholder 不见了

    其实不是光标不见了,只是颜色是白色。

    placeholder 可以使用上述方法(设置 setPlaceholderAttributedString)来设置。

    光标可以参考第六大点,自定义光标。

    6、多行显示不下时,最后一行显示省略号

    [[field cell] setLineBreakMode:NSLineBreakByCharWrapping];   

    [[field cell] setTruncatesLastVisibleLine:YES];

    1

    2

    7NSTextField 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

  • 相关阅读:
    布隆过滤器(Bloom Filter)简要介绍
    利用skipList(跳表)来实现排序(待补充)
    rpc、socket、tcp/udp简要梳理
    微服务、rest/restful、springmvc、http简要梳理
    Kafka生产者producer简要总结
    相同数据源情况下,使用Kafka实时消费数据 vs 离线环境下全部落表后处理数据,结果存在差异
    kafka部分重要参数配置-broker端参数
    spring boot-- 三种启动方式
    spring boot --部署war到tomcat中
    阿里云服务上面部署redis + 本地Redis客户端连接方法
  • 原文地址:https://www.cnblogs.com/sundaymac/p/10329595.html
Copyright © 2011-2022 走看看