繁体   English   中英

可可NSTextField 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM