一个比较笨的方法----限制NSTextField的输入。
基本思路:取得当前输入的字符,如果不满足条件,就在NSTextField中将当前输入删除。
-(void)textFieldNotAllowedInput:(NSTextField*)textField inString:(NSString*)inString atIndex:(int)atIndex
{
NSRange rangeFirst =NSMakeRange(0, atIndex -1);
NSString* strFirst = [inString substringWithRange:rangeFirst];
NSRange rangeLast =NSMakeRange(atIndex, [inString length]-atIndex);
NSString* strSec = [inString substringWithRange:rangeLast];
[textField setStringValue:@""];
NSString* strInputTemp = @"";
[textField setStringValue:[strInputTemp stringByAppendingString:strFirst]];
strInputTemp = [textField stringValue];
[textField setStringValue:[strInputTemp stringByAppendingString:strSec]];
[[textField currentEditor] setSelectedRange:NSMakeRange(atIndex-1,0)];
}
在判断NSTextField当前输入时,需要一个callback函数,可以通过NSTextField的
-(void)textDidChange:(NSNotification *)notification 来进行callback的设置。
设置好callback之后,就可以调用以上的方法,对NSTextField进行各种限制啦。
例如:
- (void)myTextFieldCallBack
{
NSRange range = [[myTextField currentEditor] selectedRange];
int iSel = range.location;
NSString*strInput = [myTextField stringValue];
constchar*acStr = [strInput UTF8String];
intnLen = [strInput length];
// 限制最大输入长度
if (nLen >6)
{
[self textFieldNotAllowedInput:myTextField inString:strInput atIndex:iSel];
return;
}
char cInputTmp = acStr[iSel -1];
// 限制输入:只有小数点和数字可以输入
if (('.'==acStr[iSel-1]) || (cInputTmp >= '0' && cInputTmp <='9') )
{
}
else
{
[self textFieldNotAllowedInput:myTextField inString:strInput atIndex:iSel];
return;
}
// 限制小数点后只能输入两位
if ((cInputTmp >='0' && cInputTmp <='9') )
{
NSRange range = [strInput rangeOfString:@"."];
if(range.length > 0)
{
if( ((nLen - range.location) > 3))
{
[self textFieldNotAllowedInput:myTextField inString:strInput atIndex:iSel];
return;
}
}
}
// 限制小数点出现的位置和次数
// 第一个字符不能是小数点
if ('.' == acStr[iSel-1])
{
if (iSel <2)
{
[self textFieldNotAllowedInput:myTextField inString:strInput atIndex:iSel];
return;
}
// 小数点在整个字串中只能出现一次
NSRange rangesearch1 =NSMakeRange(0, iSel-1);
NSRange rangesearch2 =NSMakeRange(iSel, [strInput length]-iSel);
NSRange range1 = [strInput rangeOfString:@"." options:nil range:rangesearch1];
NSRange range2 = [strInput rangeOfString:@"." options:nil range:rangesearch2];
if(range1.length > 0 || range2.length >0)
{
[self textFieldNotAllowedInput:myTextField inString:strInput atIndex:iSel];
return;
}
}
}