swift—UITextField与 NSTextView 的键盘事

CocoaNSTextField NSTextView 的键盘事件

阅读 1889

收藏 13

2016-07-16

原文链接:blog.seedlab.io

本文就介绍一下 NSTextField、NSTextView 以及键盘事件的事件处理,文末有完整代码。

NSTextField NSTextView Field Editor

Cocoa 为我们提供的文本编辑控件有 NSTextField 和 NSTextView,前者较为轻量,支持文本编辑;后者能提供更多复杂的功能,比如设置字体等。

它们在表现上明确的区别是:对于 Enter 和 Tab 键的行为不同。NSTextField 类似其他非文本编辑的 Cocoa 控件:Enter 键触发终止编辑,Tab 键令焦点移到相邻下一控件;NSTextView 则给编辑内容添加换行或者 tab 字符。

Field Editor 则是 Window 中一个特殊的 NSTextView。

NSTextField

通常我们把 Text Field 作为简单的文字编辑控件使用。像所有的控件一样,Text Field 有自己的 target 和 action。非法的输入将触发 Text Field 向 target 发送特殊的 error action 消息。

Text Field 由 NSTextFieldCell 和 NSTextField 组成,NSTextFieldCell 实现了大多数方法,NSTextField 继承自 NSControl,作为 NSTextFieldCell 的 Container 为其所有方法进行封装。NSTextField 提供了一些类似 textDidBeginEditing: 的 delegate 方法。

NSTextView

Text View 通常用于多行带有样式的复杂文字编辑。用户可以控制 Text View 的文字内容、字体、颜色、样式和其他属性。

NSTextView 是 NSText 的子类。

Field Editor

Field Editor 是一个 Window 中所有控件共享的一个 NSTextView。这个被共享的 Text View 会自动的插入 View Hierarchy,为正在 Editing 的 Text Field 提供文字编辑的功能,处理键盘事件和显示文字。下图为此时状态说明:

因为 Window 内的 Text Fields 处于 Editing 状态的至多只有一个,因此系统只创建了一个 NSTextView 的实例来作为 Field Editor。开发者也可以选择实现自己的 Field Editor,详细可参见: Working with the Field Editor

处理 NSTextField NSTextView 的键盘事件

键盘事件处理一文中提到,键盘事件最终会进入 keyDown: 方法中,在 NSTextField 与 NSTextView 中,会由 interpretKeyEvents: 并根据键盘事件是否有绑定的 Command,向调用者发送 doCommandBySelector: 或 insertText: 消息。

因此,想要捕捉 Enter 和 Shift-Enter 事件只需在合适的地方重写相应的 Command 方法即可。

实际上我们并不需要继承它们来改写方法,NSTextFieldDelegate 和 NSTextViewDelegate 中都有对应的方法可以处理 doCommandBySelector: 的方法。

NSTextField

NSTextFieldDelegate 继承了 NSControlTextEditingDelegate,其中:

optional func control(_ control: NSControl,

textView textView: NSTextView,

doCommandBySelector commandSelector: Selector) -> Bool

可以根据 commandSelector 判断事件类型,并进行定制化的处理。方法返回 true 表示 delegate 已经处理了事件,系统将不再执行 commandSelector,返回 false 系统则会进行默认的处理。

enter 对应的 commandSelector 为 insertNewline: 。此外通过 NSApplication 中 currentEvent?.modifierFlags 的值即可判断是否同时按下了 shift 键。

在 NSTextField 中 insertNewline: 的系统行为是结束编辑,如果需要插入新的一行应该调用 textView.insertNewlineIgnoringFieldEditor: 方法,这是 NSTextField 中 Option-Enter 对应的 Command Selector 。

其实并不建议改写系统默认行为,应该考虑是否可用 Text View 代替。

相关代码片段如下:

func control(control: NSControl, textView: NSTextView, doCommandBySelector commandSelector: Selector) -> Bool {

if commandSelector == #selector(insertNewline(_:)) {

if let modifierFlags = NSApplication.sharedApplication().currentEvent?.modifierFlags

where (modifierFlags.rawValue & NSEventModifierFlags.ShiftKeyMask.rawValue) != 0 {

print("Shift-Enter detected.")

} else {

print("Enter detected.")

}

textView.insertNewlineIgnoringFieldEditor(self)

return true

}

return false

}

NSTextView

类似 NSTextFieldDelegate,NSTextViewDelegate 提供的相关方法为:

optional func textView(_ textView: NSTextView,

doCommandBySelector commandSelector: Selector) -> Bool

方法具体实现类似 NSTextFieldDelegate 相关方法,不再赘述。

Demo

一个简单的 Demo,实现了:

  • 判断 NSTextField 的 Enter 和 Shift-Enter 事件,并插入新的一行;
  • 判断 NSTextView 的 Enter 和 Shift-Enter 事件。

完整代码:SeedLabIO/TextFieldExample · GitHub

Happy Coding ??.

参考

原文地址:https://www.cnblogs.com/sundaymac/p/10330810.html

时间: 2024-11-06 09:54:47

swift—UITextField与 NSTextView 的键盘事的相关文章

Swift - UITextField完成输入后关闭软键盘

总结了以下几种方式,欢迎补充  1,为空白区域绑定Touch Up Inside事件  2,重写touchesEnded方法  3,为TextField绑定Did End On Exit事件 一.点击编辑区域以外的地方时关闭(空白处区域绑定Touch Up Inside事件)     新建一个项目,打开Main.storyboard,添加一个Text Field,与ViewController建立连接,然后点击空白处,在右边窗口修改Custom Class 的class改为UIControl  

swift UITextField

var textField = UITextField(frame: CGRectMake(10,160,200,30)) //设置边框样式为圆角矩形 textField.borderStyle = UITextBorderStyle.RoundedRect textField.delegate = self textField.placeholder = "请输入用户名" //文字大小超过文本框长度时自动缩小字号,而不是隐藏显示省略号 textField.adjustsFontSiz

UITextField控件处理键盘弹出时遮住输入框的问题

原文连接: http://www.devdiv.com/thread-70159-1-1.html 实现以下三个方法,如果弹出的键盘会遮住输入框 ,整体的界面会向上移动,这样就不会遮住输入框了.自己增加UITextFieldDelegate委托. 只适合iPhone,如果想要支持iPad,只要把216改成iPad上面键盘的高度即可. 1 - (void)keyboardWillShow:(NSNotification *)noti 2 { 3 //键盘输入的界面调整 4 //键盘的高度 5 fl

iOS开发——Swift实战篇&通知之键盘的现实与隐藏(加键盘工具条)

看这篇文章之前,建议读者先了解一下通知NSNotifation的通信原理 不好描述,我先上图: 就是点击“完成”可以隐藏键盘和自己,键盘出来时他们也跟着出来,对,就是这种效果,非常常用 1,设置keyboardHeaderview和“完成”(这里的self.keyboardHeaderView设置成了self对象) 1 self.keyboardHeaderView.frame = CGRect(x: 0,y: DeviceFrame.height+StatusBarFrame.height,w

swift - UITextField 的用法

1,文本框的创建,有如下几个样式: UITextBorderStyle.None:无边框 UITextBorderStyle.Line:直线边框 UITextBorderStyle.RoundedRect:圆角矩形边框 UITextBorderStyle.Bezel:边线+阴影 1 2 3 4 let textField = UITextField(frame: CGRectMake(10,160,200,30)) //设置边框样式为圆角矩形 textField.borderStyle = UI

Swift—UITextField的基本用法

https://www.jianshu.com/p/63bdeca39ddf 1.文本输入框的创建##### let textField = UITextField(frame: CGRect(x:10, y:60, width:200, height:30)) // let textField = UITextField() // textField.frame = CGRect(x:20,y:30,width:100,height:30) //设置边框样式为圆角矩形 textField.bo

Swift之键盘类型与常见的键盘隐藏方法

// //  ViewController.swift //  UITextField键盘类型 // //  Created by mac on 15/4/19. //  Copyright (c) 2015年 mac. All rights reserved. // import UIKit class ViewController: UIViewController ,UITextFieldDelegate{ var text = UITextField() var pwdtext = UI

Swift - 键盘弹出样式

Swift提供了11种键盘类型: 在开发中,我们可以根据不同的需求,选择不同的键盘样式,例如,当我们只需要输入手机号码时,可以选择纯数字类型的键盘(.NumbersAndPunctuation),当我们需要输入网址时,可以选择URL样式的键盘(.URL),其中,默认的键盘样式(.Default)就是(.NamePhonePad)样式. 我们可以通过输入框的 UIKeyboardType 来设置键盘样式 UITextField().keyboardType = .NamePhonePad // /

iOS UITextField完成输入后关闭键盘的方法总结

// //  ViewController.swift //  UITextField完成输入后关闭键盘的方法 // //  Created by 悦兑科技 on 15/1/19. //  Copyright (c) 2015年 BSY. All rights reserved. // import UIKit class ViewController: UIViewController,UITextFieldDelegate { var textF = UITextField() overri