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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM