Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Eigene NSFormatter, Teil 2

Einer der großen Vorteile der objektorientierten Programmierung ist die Wiederverwendbarkeit von Klassen. Sie brauchen für den GeoConverter also keinen neuen Formatter programmieren, sondern Sie können die Klasse aus dem Testprogramm benutzen, von deren Funktionsfähigkeit Sie sich ja schon selbst überzeugen konnten.

Um die beiden Dateien in Ihr Projekt zu bekommen, genügt es, Sie aus dem Finder in Ihr Projekt hineinzuziehen. Am besten gleich in den Ordner Classes. Xcode wird Sie nun fragen, ob Sie eine Kopie der Dateien machen wollen, und dies sollten Sie auch tun.
stacks_image_28B03C05-D7EA-4527-A0FF-4EBAFB6A24DA
Jetzt müssen Sie nur noch drei Instanzen der Formatter-Klasse erzeugen und mit den NSTextFields verbinden. Das kennen Sie schon. Trotzdem hier noch einmal der Programmcode:
- (void)awakeFromNib
{
    MyFormatter *z1Formatter = [[MyFormatter alloc]init] ;
    [inputGrad setFormatter:z1Formatter];
    [z1Formatter release];

    MyFormatter *z2Formatter = [[MyFormatter alloc]init] ;
    [inputMinuten setFormatter:z2Formatter];
    [z2Formatter release];

    MyFormatter *z3Formatter = [[MyFormatter alloc]init] ;
    [inputSekunden setFormatter:z3Formatter];
    [z3Formatter release];
}
Vergessen Sie aber nicht, die Formatter-Klasse zu importieren. Ohne diese Anweisung werden Sie ihr Projekt nicht erstellen können.

Wenn Sie möchten, können Sie auch einen einzigen Formatter für alle drei Eingabefelder verwenden. Der Code könnte dann so aussehen.
- (void)awakeFromNib
{
    MyFormatter *aFormatter = [[MyFormatter alloc]init] ;
    [inputGrad setFormatter:aFormatter];
    [inputMinuten setFormatter:aFormatter];
    [inputSekunden setFormatter:aFormatter];
    [aFormatter release];
}
Mit dieser Erweiterung ist Ihr GeoConverter eine ganzes Stück professioneller geworden. Und Sie haben sogar einen NSFormatter erzeugt, den Sie auch in zukünftigen Anwendungen verwenden können. Die Möglichkeiten eines NSFormatter sind schier unbegrenzt. Eine weitere Funktion werden Sie jetzt noch kennenlernen.

Manchmal wird es nötig sein, bei einer Eingabe wirklich nur das zuletzt eingegebene Zeichen zu untersuchen. Eine erweiterte isPartialStringValid-Methode ist genau für diesen Zweck ausgelegt. Dieser Methodenaufruf hat ein paar mehr Parameter, unter anderem auch zwei Parameter vom Typ NSRange. Eine NSRange definiert einen Bereich, oder Abschnitt, innerhalb einer Zeichenfolge oder eine anderen Art von Auflistung. Mit diesen Parametern und einer kleinen Berechnung ist es möglich, das zuletzt eingegeben Zeichen zu ermitteln.
- (BOOL) isPartialStringValid: (NSString **) partialStringPtrproposedSelectedRange:
     (NSRangePointer) proposedSelRangePtroriginalString: (NSString *) origString
     originalSelectedRange: (NSRange) origSelRangeerrorDescription:
     (NSString **) error
{
    NSRange aRange;
    NSString *newText;

    aRange = NSMakeRange(origSelRange.location,proposedSelRangePtr->location
     - origSelRange.location);
    newText = [*partialStringPtr substringWithRange: aRange];

    NSLog(
@"%@",newText);

    return YES;
}
Wenn Sie diese Methode ebenfalls in Ihrem Formatter implementieren, werden Sie feststellen, dass die erste isPartialStringValid-Methode nicht mehr aufgerufen wird. Sie müssen sich entscheiden wie Sie vorgehen. Beide Methoden zu benutzen, ist nicht möglich.

nächste Seite