1.1 NSTextField
NSTextField是类似于JTextField等诸如此类的“可接受文本”的控件,用来应用与用户的信息交互。其创建过程类似于UITextField,使用NSTextField也需要代理的注册。
1.1.1 基本声明
(为方便布局,采取SnapKit第三方库,其用法与iOS如出一辙)
var textField: NSTextField!
private func initView(){
textField = NSTextField()
textField.placeholderString = "Input content please."
self.view.addSubview(textField)
textField.snp.makeConstraints{ make in
make.width.equalTo(self.view.frame.width - 100)
make.height.equalTo(25)
make.centerX.equalToSuperview()
make.top.equalTo(self.view.snp.top).offset(15)
}
}
说明:先声明一个类变量,接着在intiView()这个方法内进行实例化、设置提示文本,然后添加到父容器也即是self.view这个对象内。最后进行布局。使用时将initView()方法在viewDidLoad()内进行调用即可。
1.1.2 属性或方法
1.读取或设置NSTextField的文本:
textField.stringValue
如果是富文本内容进行读取则是attributedStringValue这个属性。
2.设置NSTextField是否能被编辑:
textField.isEditable = false
3.设置光标移至提醒:
有时候用户不明白该输入框作用是什么,可以设置toolTip
进行提醒。
textField.toolTip = "Test info."
1.1.3 常见代理
同UIKit中UITextField一样,如果要进行业务的编写,就需要实现NSTextFieldDelegate该协议。
常见代理方法如下:
func control(_ control: NSControl, textShouldEndEditing fieldEditor: NSText) -> Bool {
} // 应该结束编辑状态回调
func control(_ control: NSControl, textShouldBeginEditing fieldEditor: NSText) -> Bool {
} // 应该开始编辑状态回调
func controlTextDidBeginEditing(_ obj: Notification) {
} // 光标进入输入框内第一次进行回调
func controlTextDidEndEditing(_ obj: Notification) {
} // 光标离开输入框时回调
func controlTextDidChange(_ obj: Notification) {
} // 输入框内容改变时进行回调
需要说明的是,后面三个方法参数为Notification对象,需要进行转型判断(即一个Window内存在多个NSTextField需要对其变量种类判断)。
本节内容代码如下:
//
// ViewController.swift
// Versatile
//
// Created by Eldest's MacBook on 2021/10/2.
//
import Cocoa
import SnapKit
class ViewController: NSViewController , NSTextFieldDelegate{
var textField: NSTextField!
private func initView(){
textField = NSTextField()
textField.placeholderString = "Input content please."
// textField.bezelStyle = .squareBezel
textField.delegate = self
// textField.backgroundColor = .systemBlue
textField.isEditable = true
textField.toolTip = "Test info."
self.view.addSubview(textField)
textField.snp.makeConstraints{ make in
make.width.equalTo(self.view.frame.width - 100)
make.height.equalTo(25)
make.centerX.equalToSuperview()
make.top.equalTo(self.view.snp.top).offset(15)
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
initView()
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
// MARK: - Delegate.
func control(_ control: NSControl, textShouldEndEditing fieldEditor: NSText) -> Bool {
print("------>textShouldEndEditin: \(textField.stringValue)")
return true
}
func control(_ control: NSControl, textShouldBeginEditing fieldEditor: NSText) -> Bool {
print("------>textShouldBeginEditing: \(textField.stringValue)")
return true
}
func controlTextDidBeginEditing(_ obj: Notification) {
let tempTextField = obj.object as! NSTextField
print("------> controlTextDidBeginEditing: \(tempTextField.stringValue)")
}
func controlTextDidEndEditing(_ obj: Notification) {
let tempTextField = obj.object as! NSTextField
print("------>controlTextDidEndEditing: \(tempTextField.stringValue)")
}
func controlTextDidChange(_ obj: Notification) {
let tempTextField = obj.object as! NSTextField
print("------>controlTextDidChange: \(tempTextField.stringValue)")
}
}
运行截图如下: