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

  • 相关阅读:
    jquery easy ui 学习 (8)basic treegrid
    jquery easy ui 学习 (7) TreeGrid Actions
    jquery easy ui 学习 (6) basic validatebox
    jquery easy ui 学习 (5) windowlayout
    jquery easy ui 学习 (4) window 打开之后 限制操纵后面元素属性
    提示“应用程序无法启动,因为应用程序的并行配置不正确”不能加载 System.Data.SQLite.dll
    visual studio 添加虚线的快捷键
    VS2010打开项目时,出现“已经在解决方案中打开了具有该名称的项目”问题的解决方案
    visual studio 编译时 出现 Files 的值 乱码
    微信 连接被意外关闭
  • 原文地址:https://www.cnblogs.com/sundaymac/p/10329595.html
Copyright © 2011-2022 走看看