2015-04-07 3 views
0

Я сделать NSTextField, который имеет следующие характеристики:
1) позволяет только целые значения (0-9)
2) длинные
3) мин 1 1 или 2 цифры , не более 99
4) если введено 0, значение должно измениться на 1
5) если нажата кнопка удаления, и ячейка полностью опустела, значение должно измениться на 1 и будет автоматически выбрано (с подсветкой) так что пользователь может просто ввести новое значениекакао NSTextField NSNumberFormatter и делегировать

Я могу получить это поведение, создав для вопрос и делегат, но я хочу реализовать это исключительно в пользовательском форматировании (чтобы все было «просто», я полагаю).

Вот код, у меня есть:

В файле делегата:

- (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 

Как я могу упростить это?

ответ

2

Если вы внесете -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; 
} 
+0

Спасибо за это предложение. Однако это позволяет вводить буквы (хотя они выбраны, но клавиша курсора может отменить выбор), а 0 - действительная запись. Я приму свой ответ, потому что это, вероятно, просто нуждается в нескольких настройках. – tosa

+0

Да, это было всего пару минут, чтобы исправить эти два предмета. Еще раз спасибо! – tosa

Смежные вопросы