OS X开发.第一章,1.1,NSTextField

本文详细介绍了如何在MacOS应用中使用NSTextField进行用户交互,包括初始化、设置属性、方法以及实现NSTextFieldDelegate代理方法。通过SnapKit库进行约束布局,同时展示了如何设置提示文本、禁用编辑、添加toolTip提示以及监听文本变化等关键步骤。此外,还提供了代码示例和运行截图,帮助开发者更好地理解和运用NSTextField。
摘要由CSDN通过智能技术生成

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)")
    }

}


运行截图如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值