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

Obwohl unsere Anwendung problemlos funktioniert, hat sie Schönheitsfehler. Beispielsweise ist es möglich, auch Buchstaben in den Eingabefelder einzutragen. Zwar kann das Programm damit nicht zum Abstürzen gebracht werden, schön ist dieses Verhalten jedoch nicht. Zum Glück haben die Entwickler von Apple für solche Probleme eine passende Klasse parat, die uns Hilfe leisten kann. Es ist die Klasse NSFormatter.
Im Framework, und sogar in der Objekt Library, gibt es bereits Varianten der NSFormatter-Klasse, die verschiedene Aufgaben erfüllen. NSDateFormatter dient zur Formatierung von Datum oder Zeitwerten, NSNumberFormatter übernimmt die Formatierung von Zahlen. Die Vorgehensweise ist allerdings bei allen Klassen identisch. Ein Wert eines beliebigen Typs wird in eine formatierte Zeichenkette umgewandelt, welche anschließend für die Anzeige verwendet wird.
Um eine Klasse zu entwicklen, die Eingaben von Buchstaben verhindert, müssen wir eine komplett neue Klasse entwicklen und von der Klasse NSFormatter erben. Erstellen Sie eine Swift-Klasse mit den Name InputFormatter und erweitern Sie diese wie im folgenden Listing zu sehen:
import Foundation

class InputFormatter: NSFormatter
{

}
Eine NSFormatter-Klasse ist ein mächtiges Werkzeug, das viele verschiedene Anwendungsmöglichkeiten unterstützt. Zwei Methoden, die ein neuer Formatter immer überschreiben muss, sind stringForObjectValue und getObjectValue. Sie übernehmen die Aufgabe, den zur formatierenden Wert vom Typ AnyObject in einen String, und zurück zu AnyObject, zu konvertieren. Eine besondere Formatierung wird bei den Methoden im folgenden Listing nicht angewendet.
import Foundation

class InputFormatter: NSFormatter
{
    override func stringForObjectValue(obj: AnyObject) -> String?
    {
        if let stringObject = obj as? String
        {
            return stringObject
        }
        return nil
    }

    override func getObjectValue(obj: AutoreleasingUnsafeMutablePointer
     , forString string: String, errorDescription error:
     AutoreleasingUnsafeMutablePointer) -> Bool
    {
        obj.memory = string
        return true
    }
}
Soll die Klasse den ihr zur Formatierung übergebenen Wert verwerfen oder manipulieren, muss von der Klasse zusätzlich die Methode isPartialStringValid implementiert werden.
override func isPartialStringValid(partialString: String, newEditingString newString:
     AutoreleasingUnsafeMutablePointer,
     errorDescription error: AutoreleasingUnsafeMutablePointer) -> Bool
{

}
Besonders wichtig bei der Methode sind die Parameter partialString und newString. Gibt die Methode true zurück, wird partialString als formatierter Wert verwendet, bei false der Wert von newString. newString wird als Zeiger in die Methode übergeben und kann über seine Eigenschaft memory verändert werden. Möchten Sie eine Eingabe automatisch in Großbuchstaben umwandeln, muss die Methode false zurückgeben. Zusätzlich wird dem Bezeichner newString eine in Großbuchstaben umgewandelte Version der Eingabe zugewiesen.
override func isPartialStringValid(partialString: String, newEditingString newString:
AutoreleasingUnsafeMutablePointer,
errorDescription error: AutoreleasingUnsafeMutablePointer) -> Bool
{
    newString.memory = partialString.uppercaseString
    return false
}
Um unsere Formatter-Klasse auszuprobieren, müssen wir eine Instanz einem der Eingabefelder als Formatter zuweisen. Gut geeignet ist die applicationDidFinishLaunching-Methode, die Xcode in der Controller-Klasse für uns vorbereitet hat.
func applicationDidFinishLaunching(aNotification: NSNotification)
{
    var formatter = InputFormatter()
    self.inputDegree.formatter = formatter
}
Jetzt werden automatisch sämtliche eingegebenen Buchstaben in Großbuchstaben umgewandelt. Das ist zwar nicht das Ergebnis, das wir ursprünglich erreichen wollen, wir sind trotzdem auf dem richtigen Weg.
stacks_image_2BD52611-0EED-432D-A8F8-8B09CEF1563C