美文网首页Mac OSX 入门
Mac app 开发之-NSTextField 输入框

Mac app 开发之-NSTextField 输入框

作者: 魔都兰陵王 | 来源:发表于2018-12-18 10:02 被阅读12次

上一篇文章中讲述了如何使用 NSTextField展示文本,这一篇章就要讲如何NSTextField输入文字。

基本使用

NSTextField默认可以显示多行,

        let textField = NSTextField(frame: CGRect(x: 20, y: 20, width: width()-40, height: 100))
        textField.textColor = NSColor.white
        textField.placeholderString = "请输入文字" // 设置占位文字
        textField.font = NSFont(name: "Marker Felt", size: 20) 
        textField.isSelectable = false  // 是否可选中textFiled的文字
        textField2.bezelStyle = NSTextField.BezelStyle.roundedBezel // 设置蓝色边框的样式
        textField2.focusRingType = NSFocusRingType.none //编辑状态下,外边框的样式
        textField2.nextKeyView = button //点击tab获取焦点的下一个textFiled, 当然也可以是别的View
        view.addSubview(textField)
效果如下: 默认效果图

"请输入"是textfield 的placeholderString,颜色灰,font和textField.font一样(Marker Felt不支持汉字, 使用自定义字体是需注意)。
在NSTextField在输入时默认是带边框的,就像上图中的蓝色边框.

关于NSTextFiledDelegate

NSTextField 还有几个在UITextFiled中是存在UITextFieldDelegate中的方法

    open func textShouldBeginEditing(_ textObject: NSText) -> Bool

    open func textShouldEndEditing(_ textObject: NSText) -> Bool

    open func textDidBeginEditing(_ notification: Notification)

    open func textDidEndEditing(_ notification: Notification)

    open func textDidChange(_ notification: Notification)

好在 NSTextFiledDelegate: NSControlTextEditingDelegate而在NSControlTextEditingDelegate中有类似UITextFieldDelegate的方法

  //开始编辑文本
    optional public func controlTextDidBeginEditing(_ obj: Notification)
 //结束编辑文本
    optional public func controlTextDidEndEditing(_ obj: Notification)
///文本改变...
    optional public func controlTextDidChange(_ obj: Notification)

/// 将要开始编辑文本;这些委托和通知方法是从允许文本编辑的NSControl子类发送的,例如NSTextField和NSMatrix。 这些类需要发送具有委托。NSControl不会响应。
    optional public func control(_ control: NSControl, textShouldBeginEditing fieldEditor: NSText) -> Bool
///将要结束编辑文本
    optional public func control(_ control: NSControl, textShouldEndEditing fieldEditor: NSText) -> Bool
显示富文本内容
//同iOS类似,没啥好说的
textField.attributedStringValue = NSAttributedString(string: "", attributes: [NSAttributedString.Key : Any])
设置富文本的placeholder
@available(OSX 10.10, *)
   @NSCopying open var placeholderAttributedString: NSAttributedString?
多行文本显示不下时,最后一行显示省略号
 textField.cell?.lineBreakMode = NSLineBreakMode.byCharWrapping //设置断行模式
 textField.cell?.truncatesLastVisibleLine = true //设置超出行数是否隐藏
设置单行显示
textField.cell?.usesSingleLineMode = true  //设置是否启用单行模式 
取消获取焦点时高亮状态(不显示外边框)
textField.focusRingType = NSFocusRingType.none
取消焦点(resignFirstResponder)
//textField.resignFirstResponder()是无效的
self.view.window?.makeFirstResponder(nil)
如何输入密码(密文)

iOS的UITextField 可以简单的设置 secureTextEntry = YES;做到密文输入。
Mac 需要NSSecureTextField来做到密文输入,NSSecureTextField是NSTextField的子类,用法和NSTextField大同小异。

关于cell

NSTextField继承于NSControl,NSControl中有一个属性为cell。

open var cell: NSCell?

so在NSTextField中,还有一个继承于父类的NSCell,所以在我们设置NSTextField的边框颜色时需要同时设置NSCell的相应属性。
cell 是 cocoa 在当时硬件条件下的一种优化。cocoa 是利用显卡3d 加速能力的 GUI 框架

自定义光标

NSTextField 的 cell 继承自 NSTextFieldCell, NSSearchField 的 cell 继承自 NSSearchFieldCell;NSSecureTextField 的 cell 继承自 NSSecureTextFieldCell

自定义一个Cell子类,并将子类cell设置为TextField的cellClass

func setup() {
   //自定义设置(重写init方法中调用该方法)
}

//设置光标颜色
override func setUpFieldEditorAttributes(_ textObj: NSText) -> NSText {
    let text = super.setUpFieldEditorAttributes(textObj) as! NSTextView
    text.insertionPointColor = NSColor.orange
    return text
}

相关文章

网友评论

    本文标题:Mac app 开发之-NSTextField 输入框

    本文链接:https://www.haomeiwen.com/subject/gqjkkqtx.html