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的教程和公开内容,仅用于技术交流 ...
随机推荐
- 纯CSS3绘制神奇宝贝伊布动画特效
在线演示 本地下载
- Codeforces 1228C. Primes and Multiplication
传送门 当然是考虑 $n$ 的每个质数 $p$ 对答案的贡献 考虑 $p^k$ 在 $[1,m]$ 中出现了几次,显然是 $\left \lfloor \frac{m}{p^k} \right \rf ...
- O004、启动第一个KVM虚机
参考https://www.cnblogs.com/CloudMan6/p/5249270.html 本节演示如何使用 virt-manager 启动 KVM 虚机, 提前下载一个 cirro ...
- 如何在万亿级别规模的数据量上使用Spark
一.前言 Spark作为大数据计算引擎,凭借其快速.稳定.简易等特点,快速的占领了大数据计算的领域.本文主要为作者在搭建使用计算平台的过程中,对于Spark的理解,希望能给读者一些学习的思路.文章内容 ...
- computed、watch、methods的区别
computed:计算属性是用来声明式的描述一个值依赖了其它的值.当你在模板里把数据绑定到一个计算属性上时,Vue 会在其依赖的任何值导致该计算属性改变时更新 DOM.这个功能非常强大,它可以让你的代 ...
- 解决postgresql数据库localhost可以连接,ip连接不了的问题
解决:windows环境下,postgresql数据库,localhost可以连接,ip地址连接不了. 解决办法: 1.打开postgresql安装目录下的配置文件 pg_hba.conf ...
- c++ vector数组的使用
介绍: 首先我们要明白以下几点: 1.vector数组是一个能存放任意数据类型(类,结构,普通变量类型等)的动态数组!,在数据结构中就相当于顺序储存的线性表,寻找元素非常快,但是插入元素的时间却很大( ...
- 03-spring框架—— AOP 面向切面编程
3.1 动态代理 动态代理是指,程序在整个运行过程中根本就不存在目标类的代理类,目标对象的代理对象只是由代理生成工具(不是真实定义的类)在程序运行时由 JVM 根据反射等机制动态生成的.代理对象与目标 ...
- 团队作业-Beta冲刺(周五)
一. 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/ 这个作业要求在哪里 https://edu.c ...
- ubuntu下安装tensorflow-gpu版本过程
我之前已经安装了cpu-only版的tensorflow,所以现在要先把原先的tf卸载 sudo pip uninstall tensorflow sudo pip3 install tensorfl ...