![](/img/trans.png)
[英]Customize error message in NSTextField with NSNumberFormatter
[英]Cocoa NSTextField NSNumberFormatter and delegate
我正在制作具有以下特征的NSTextField:
1)僅允許整數值(0-9)
2)是1或2位數字
3)最小值為1,最大值為99
4)如果輸入0,則值應改回1
5)如果按下Delete鍵並且該單元格已完全清空,則該值應更改為1並自動選擇(高亮顯示),以便用戶可以簡單地鍵入一個新值
我可以通過創建自定義格式器和委托來實現此行為,但我想僅在自定義格式器中實現此功能(以使事情“簡單”起來)。
這是我的代碼:
在委托文件中:
- (void)controlTextDidChange:(NSNotification *)aNotification
{
if ([[txtfldSaveDuration stringValue] length]==0) {
[txtfldSaveDuration setStringValue:@"1"];
}
if ([[txtfldSaveDuration stringValue] isEqualToString:@"0"]) {
[txtfldSaveDuration setStringValue:@"1"];
}
}
在自定義格式文件中:
@implementation OnlyIntegerValueFormatter
- (BOOL)isPartialStringValid:(NSString*)partialString newEditingString: (NSString**)newString errorDescription:(NSString**)error
{
// necessary otherwise can't delete (to select) the first character
if([partialString length] == 0) {
return YES;
}
// two integer max length (99)
if([partialString length] > 2) {
return NO;
}
// integers only
NSScanner* scanner = [NSScanner scannerWithString:partialString];
if(!([scanner scanInt:0] && [scanner isAtEnd])) {
NSBeep();
return NO;
}
return YES;
}
@end
我該如何簡化呢?
如果實現-isPartialStringValid:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:
相反,您將獲得更多的控制權,包括對結果選定范圍的控制。
大概是這樣的:
- (BOOL)isPartialStringValid:(NSString **)partialStringPtr
proposedSelectedRange:(NSRangePointer)proposedSelRangePtr
originalString:(NSString *)origString
originalSelectedRange:(NSRange)origSelRange
errorDescription:(NSString **)error
{
if ([*partialStringPtr length] == 0)
{
*partialStringPtr = @"1";
*proposedSelRangePtr = NSMakeRange(0, [*partialStringPtr length]);
return NO;
}
// two integer max length (99)
if ([*partialStringPtr length] > 2)
{
NSRange changed = NSMakeRange(origSelRange.location, [*partialStringPtr length] - (origString.length - origSelRange.length));
NSRange excess;
excess.length = [*partialStringPtr length] - 2;
excess.location = changed.location + (changed.length - excess.length);
*partialStringPtr = [*partialStringPtr stringByReplacingCharactersInRange:excess withString:@""];
*proposedSelRangePtr = NSMakeRange(excess.location, 0);
return NO;
}
// integers only
NSScanner* scanner = [NSScanner scannerWithString:*partialStringPtr];
scanner.charactersToBeSkipped = nil;
if(!([scanner scanInt:0] && [scanner isAtEnd])) {
*partialStringPtr = origString;
*proposedSelRangePtr = origSelRange;
NSBeep();
return NO;
}
return YES;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.