Mac上输入与手机输入的不同是,Mac需要处理更多的键盘交互,因为Mac上的键盘输入会有多种快捷键组合。

代理方法处理

NSTextField

#pragma mark - NSTextFieldDelegate
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector
{
if ([NSStringFromSelector(commandSelector) isEqualToString:@"insertNewline:"]) { if (([NSApplication sharedApplication].currentEvent.modifierFlags & NSEventModifierFlagShift) != 0) {
NSLog(@"Shift-Enter detected.");
[textView insertNewlineIgnoringFieldEditor:self];
return YES;
}else {
NSLog(@"Enter detected.");
}
}
return NO;
}

NSTextView

#pragma mark - NSTextViewDelegate
- (BOOL)textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector
{
//insertTab: -键入tab
//insertNewline: -键入回车
//deleteBackward if ([NSStringFromSelector(commandSelector) isEqualToString:@"insertNewline:"]) { if (([NSApplication sharedApplication].currentEvent.modifierFlags & NSEventModifierFlagShift) != 0) {
NSLog(@"Shift-Enter detected.");
[textView insertNewlineIgnoringFieldEditor:self];
return YES;
}else {
NSLog(@"Enter detected.");
return YES;
}
}
return NO;
}

通过监听键盘事件处理

[NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskKeyDown handler:^NSEvent * _Nullable(NSEvent * _Nonnull aEvent) {
[self keyDown:aEvent];
return aEvent;
}];

然后重写keyDown方法

- (void)keyDown:(NSEvent *)event{
NSLog(@"%@",event.characters);
if ([event.characters isEqualToString:@"\r"]) {
NSLog(@"Enter detected.");
} else { }
}

补充 - 格式化键盘输入

OttoCustomFormatter一般用来处理纯数字输入以及密码输入

使用方法

self.inputTF.formatter = [[OttoCustomFormatter alloc] init];

代码实现

OttoCustomFormatter.h

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

typedef enum : NSUInteger {
OttoCustomFormatterTypeNumber,//纯数字
OttoCustomFormatterTypePassword,//密码
} OttoCustomFormatterType; @interface OttoCustomFormatter : NSFormatter /**
* 可输入的最大长度 默认为8
*/
@property (nonatomic,assign) NSInteger maxLength; /**
* 格式化类型 默认为纯数字类型
*/
@property (nonatomic,assign) OttoCustomFormatterType formatterType; @end NS_ASSUME_NONNULL_END

OttoCustomFormatter.m

#import "OttoCustomFormatter.h"

@implementation OttoCustomFormatter

- (instancetype)init{
self = [super init];
if (self) {
self.maxLength = 8;
self.formatterType = OttoCustomFormatterTypeNumber;
}
return self;
} - (NSString *)stringForObjectValue:(id)obj{
return (NSString *)obj;
} - (BOOL)getObjectValue:(out id _Nullable __autoreleasing *)obj forString:(NSString *)string errorDescription:(out NSString * _Nullable __autoreleasing *)error{
*obj = string;
return YES;
} - (BOOL)isPartialStringValid:(NSString * _Nonnull __autoreleasing *)partialStringPtr proposedSelectedRange:(NSRangePointer)proposedSelRangePtr originalString:(NSString *)origString originalSelectedRange:(NSRange)origSelRange errorDescription:(NSString * _Nullable __autoreleasing *)error{
if([*partialStringPtr length] == 0)
{
return YES;
}
if([*partialStringPtr length] > self.maxLength)
{
return NO;
}
NSRange passwordRange;
NSString *strLetterDigital;
if (self.formatterType == OttoCustomFormatterTypeNumber) {
strLetterDigital = @"1234567890";
} else if (self.formatterType == OttoCustomFormatterTypePassword) {
strLetterDigital = @"1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
}
NSString *strPassword;
//使用characterSetWithCharactersInString初始化字符集
NSCharacterSet *charactersetDigitAndLetter =[NSCharacterSet characterSetWithCharactersInString:strLetterDigital];
charactersetDigitAndLetter = [charactersetDigitAndLetter invertedSet];
passwordRange =NSMakeRange(origSelRange.location,
proposedSelRangePtr->location
- origSelRange.location);
strPassword= [*partialStringPtr substringWithRange: passwordRange];
if([strPassword rangeOfCharacterFromSet: charactersetDigitAndLetter
options:NSLiteralSearch].location!=NSNotFound)
{
*error =@"Illegal input";
return(NO);
}else
{
*error =nil;
return(YES);
}
} @end

Mac开发如何处理键盘事件的更多相关文章

  1. JQuery中如何处理键盘事件

    背景:比如在页面中,敲击回车键以后,实现登录功能,在之前的Winform开发时,也遇到过处理键盘事件的功能,比如游戏软件中,上下左右的移动等. 代码如下: $(document).keydown(fu ...

  2. 测试开发之前端——No6.HTML5中的键盘事件

    键盘事件 由键盘触发的事件. 适用于所有 HTML 5 元素: 属性 值 描述 onkeydown script 当按下按键时运行脚本 onkeypress script 当按下并松开按键时运行脚本 ...

  3. WinForm下的键盘事件(KeyPress、KeyDown)及如何处理不响应键盘事件

    KeyDown事件用来处理功能键:F1 F2 F3... keyPress事件用来处理字符比如说:A B C... 1 2 3... 注:处理该事件时,需要先将窗体的 KeyPreview=true; ...

  4. JavaFX桌面应用开发-鼠标事件和键盘事件

    鼠标相关事件的操作初始代码 package application; import javafx.application.Application;import javafx.event.ActionE ...

  5. javascript 键盘事件总结

    原文:http://www.cnblogs.com/rubylouvre/archive/2009/08/20/1550526.html#2583814 在进入正题前,我们看一下浏览器对于键盘的一些默 ...

  6. Qt中的键盘事件,以及焦点的设置(比较详细)

    Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效.下面关注点在按键特有的部分: focus 一个拥有焦点(focus)的QWidget才可以接受键盘事件.有输入焦点的窗口是活动窗口 ...

  7. winform中关于panel中滚动条和键盘事件几点体会

    最近在做winform开发中,遇到几个比较寄售的问题,通过上网查找计和自己琢磨,最终都圆满解决呢! 现在我将谈谈我在项目中遇到的问题集解决方案,以供大家参考! 一.就是我在使用键盘的keydown事件 ...

  8. Cocos2d-JS键盘事件

    Cocos2d-JS中的键盘事件与触摸事件不同,它没有空间方面信息.键盘事件不仅可以响应键盘,还可以响应设备的菜单.键盘事件是EventKeyboard,对应的键盘事件监听器(cc.EventList ...

  9. iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)

    手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...

随机推荐

  1. Python sqlalchemy 高级用法

    一. 关联查询 sys_user_list = SysPermission.query.join(OrgRolePermission, OrgRolePermission.sys_permission ...

  2. certutil 命令配合PS反弹后门

    Certutil.exe是一个命令行程序,作为证书服务的一部分安装.您可以使用Certutil.exe转储和显示证书颁发机构(CA)配置信息,配置证书服务,备份和还原CA组件以及验证证书,密钥对和证书 ...

  3. shell脚本之nginx启动脚本、统计日志字段、for循环实战、跳板机

    1.NGINX启动脚本 #!/bin/bash # chkconfig: 235 32 62 # description: nginx [ -f /etc/init.d/functions ] &am ...

  4. Fluent API

    fluent api用于onmodelcreating里,可以实现比attribute更强更灵活的配置 public partial class StoreDBContext : DbContext ...

  5. Nginx配置,请求到tomcat中

    一.web服务器分为两类 1.web服务器 1)Apache服务器 2)Nginx 3)IIS 2.web 应用服务器 1)tomcat 2)resin 3)jetty 区分:web服务器不能解析js ...

  6. 使用maven构建dubbo服务的可执行jar包+Dubbo 程序实例

    https://blog.csdn.net/zsg88/article/details/76100482 https://blog.csdn.net/zsg88/article/details/762 ...

  7. BLOB和CLOB

    mysql各数据类型及字节长度一览表: 数据类型 字节长度 范围或用法 Bit 1 无符号[0,255],有符号[-128,127],天缘博客备注:BIT和BOOL布尔型都占用1字节 TinyInt ...

  8. python 出现OSError: [Errno 8] Exec format error的原因

    访问 .py文件的网页的时候会出现 Exec format error的问题, 一般情况下是由于基于Unix(Linux,Mac OS)系统下的问题,办法如下 1 .chmod +x  filenam ...

  9. 判断页面是在移动端还是PC端打开的

    $(function () { var curWwwPath = window.document.location.href; var pathName = window.document.locat ...

  10. Linux进程管理工具之ps

    1.PS进程管理指令 ps    -aux USER:用户名称 PID:进程号 %CPU:进程占用CPU的百分比 %MEM:进程占用物理内存的百分比 VSZ:进程占用的虚拟内存大小(单位:KB) RS ...