簡體   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