Mac开发如何处理键盘事件
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开发如何处理键盘事件的更多相关文章
- JQuery中如何处理键盘事件
背景:比如在页面中,敲击回车键以后,实现登录功能,在之前的Winform开发时,也遇到过处理键盘事件的功能,比如游戏软件中,上下左右的移动等. 代码如下: $(document).keydown(fu ...
- 测试开发之前端——No6.HTML5中的键盘事件
键盘事件 由键盘触发的事件. 适用于所有 HTML 5 元素: 属性 值 描述 onkeydown script 当按下按键时运行脚本 onkeypress script 当按下并松开按键时运行脚本 ...
- WinForm下的键盘事件(KeyPress、KeyDown)及如何处理不响应键盘事件
KeyDown事件用来处理功能键:F1 F2 F3... keyPress事件用来处理字符比如说:A B C... 1 2 3... 注:处理该事件时,需要先将窗体的 KeyPreview=true; ...
- JavaFX桌面应用开发-鼠标事件和键盘事件
鼠标相关事件的操作初始代码 package application; import javafx.application.Application;import javafx.event.ActionE ...
- javascript 键盘事件总结
原文:http://www.cnblogs.com/rubylouvre/archive/2009/08/20/1550526.html#2583814 在进入正题前,我们看一下浏览器对于键盘的一些默 ...
- Qt中的键盘事件,以及焦点的设置(比较详细)
Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效.下面关注点在按键特有的部分: focus 一个拥有焦点(focus)的QWidget才可以接受键盘事件.有输入焦点的窗口是活动窗口 ...
- winform中关于panel中滚动条和键盘事件几点体会
最近在做winform开发中,遇到几个比较寄售的问题,通过上网查找计和自己琢磨,最终都圆满解决呢! 现在我将谈谈我在项目中遇到的问题集解决方案,以供大家参考! 一.就是我在使用键盘的keydown事件 ...
- Cocos2d-JS键盘事件
Cocos2d-JS中的键盘事件与触摸事件不同,它没有空间方面信息.键盘事件不仅可以响应键盘,还可以响应设备的菜单.键盘事件是EventKeyboard,对应的键盘事件监听器(cc.EventList ...
- iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)
手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...
随机推荐
- 生成ini文件
setProfileString是无法直接生成ini文件的,如果不存在这个ini文件需要先创建,然后再setProfileString.示例代码//保存连接参数到配置文件if not FileExis ...
- shiro配置学习
一.shiro的配置 1.shiro的web过滤 实例化ShiroFilterFactoryBean 设置securityManager.loginUrl.unauthorizedUrl.sucess ...
- F12 开发人员工具中的控制台错误消息
使用此参考解释显示在 Internet Explorer 11 的控制台 和调试程序中的错误消息. 简介 使用 F12 开发人员工具进行调试时,错误消息(例如 EC7111 或 HTML1114)将显 ...
- vsCode 前端插件推荐-和插件配置
参考自网站:https://segmentfault.com/a/1190000011779959 插件安装完成之后,还要对一些插件进行配置,例如: vetur默认配置, 配置的过程: 打开 文件 & ...
- python time,calendar,datetime
time sleep:休眠指定的秒数(可以是小数) localtime:将一个时间戳转换为time.struct_time类型的对象(类似于元组) # 将一个时间戳转换为一个类似于元组的对象,不指定时 ...
- 多Y轴示例
//多Y轴示例 <template> <div id="main" :style="{width:'1000px',height:'500px' }&q ...
- Delphi BitBtn组件
- 实验吧flag整理
奇怪的短信 flagissimple 围在栅栏里的爱ILOVESHIYANBAR. 古典密码flag:CTF{COULDYOUEXCHANGETHEINFORMATION} The Flash-14F ...
- Chrome安装Axure插件axure-chrome-extension
用Chrome打开Axure发布的原型图打不开,提示需要安装axure-chrome-extension插件,如下图提示 下面记录一下安装过程,其实很简单,插件没必要从网上到处找,在你发布的路径下就有 ...
- 会了docker你又多了一个谈资(下)
上篇文章介绍了docker 基本使用及安装([跳转☞会了docker你又多了一个谈资(上)],这篇重点说明下docker使用技巧. 问题1怎么用docker搭建多台服务器? 只需要 docker ru ...