mac 密码输入框控制——只能输入数字和字母,禁止特殊字符的输入

最近做的一个项目要求密码输入框中只能输入数字和密码,不能输入特殊字符,在网上查了一点资料,实现了改功能,现在将实现的方法总结如下:

第一步:在xib文件中拖放一个Secure Text Field 控件,按住option键,在.h文件中添加一个NSSecureTextField对象,

IBOutlet NSSecureTextField * pintext;

第二步:拖放一个object对象到xib中,将其告诉:PasswordFormatter;

第三步:右击Secure Text Field 控件,将formatter的插座变量指向PasswordFormatter。

下面是PasswordFormatter的实现代码

#import <Foundation/Foundation.h>
@interface PasswordFormatter : NSFormatter {
@private
    int maxlen; 
}
- (void)setMaximumLength:(int)len;
- (int)maximumLength;
@end

最后在类的实现部分写入如下代码:

#import "PasswordFormatter.h"
@implementation PasswordFormatter
- (id)init
{
    self = [super init];
    if (self) {
        maxlen= 8;
    }
    return self;
}

- (void)dealloc
{
    [super dealloc];
}

- (void)setMaximumLength:(int)len {
    maxlen= len;
}

- (int)maximumLength {
    return maxlen;
}

- (NSString*)stringForObjectValue:(id)object
{
    return (NSString*)object; 
}

- (BOOL)getObjectValue:(id*)object forString:(NSString*)string errorDescription:(NSString**)error 
{
    *object = string;
    return YES;
}

//下面的方法是在输入框中输入时自动调用的
- (BOOL)isPartialStringValid:(NSString**)partialStringPtr
       proposedSelectedRange:(NSRangePointer)proposedSelRangePtr
              originalString:(NSString*)origString
       originalSelectedRange:(NSRange)origSelRange
            errorDescription:(NSString**)error 
{
    //下面的是控制密码的长度是8个字符,如果大于8则不能输入
    if([*partialStringPtr length] == 0)
    {
        return YES;
    }
    if([*partialStringPtr length] >8)
    {
        return NO;
    }

    NSRange passwordRange;
    NSString *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 =@"不是数字和字母";
        return(NO);
    }else
    {
        *error =nil;
        return(YES);
    }
}

- (NSAttributedString*)attributedStringForObjectValue:(id)anObject withDefaultAttributes:(NSDictionary*)attributes {
    return nil;
}

@end

isPartialStringValid是在每次输入一个字符后自动执行,partialStringPtr是每次用户输入后的字符串,若格式化器返回NO,表示partialStringPtr不合法。若为YES表示接受新字符串。其中origString这个为输入前的字符串。

原文地址:https://www.cnblogs.com/watchdatalearn2012620/p/2876773.html