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