Alerts in iOS

Seite 2: Actions erstellen und Alerts hinzufügen

Inhaltsverzeichnis

Ein so erstellter und angezeigter Alert hat ein massives Problem: Er ist schlicht zu nichts imstande. Zwar verfügt er über einen Titel und eine Nachricht, kann aber keinerlei Aktionen ausführen. Eine Aktion in einem Alert ist dabei mit einem Button gleichzusetzen, der zum Alert angezeigt wird. Als Basis für die Aktionen dient die Klasse UIAlertAction. Sie bringt einen Initializer mit, mit dem Entwickler direkt eine neue Action für einen Alert mit allen benötigten Informationen erstellen können. Die entsprechende Deklaration sieht wie folgt aus:

convenience init(title: String?, style: UIAlertActionStyle, ↲
handler: ((UIAlertAction) -> Void)? = nil)

Der erste Parameter, title, entspricht dem Text, der dem Nutzer für die Action im Alert angezeigt wird. Der Parameter style definiert das Aussehen des Buttons unter Verwendung einer der gegebenen Optionen default, cancel und destructive. Der Style hat keinerlei funktionale Auswirkungen und dient lediglich dazu, die Buttons eines Alerts optisch voneinander abzuheben. Die Wahl pro Action sollte davon abhängig sein, welche Auswirkungen sie hat. Dient sie zum Ausblenden des Alerts, ohne etwas zu tun (sprich zum Abbruch einer Aktion), sollte cancel als Style gewählt werden. Führt die Aktion zum Löschen der Daten, sollte die Wahl auf destructive fallen. In allen anderen Fällen sollte default zum Einsatz kommen.

Die auszuführende Aktion legt der letzte Parameter, handler, fest. Er erwartet ein Closure ohne Rückgabewert, dem als Parameter der Verweis auf die zu erstellende UIAlertAction-Instanz zugrundeliegt. In den Closure gehört der Code, den die Anwendung beim Betätigen der entsprechenden Action-Schaltfläche im Alert ausführen soll. Damit stellen die UIAlertAction-Instanzen das funktionale Herzstück eines jeden Alert und Action Sheet dar.

Pro Alert können Entwickler eine beliebige Anzahl Actions nutzen. Dazu ist die Methode addAction(_:) der Klasse UIAlertController einzusetzen, um nach und nach alle UIAlertAction-Instanzen hinzuzufügen. Der Alert zeigt die Actions in genau der Reihenfolge an, in der sie in der addAction(_:)-Methode auftauchen.

Ein Beispiel demonstriert das Erstellen mehrerer Actions für einen Alert:

func changeColorActions() -> [UIAlertAction] {
let redBackgroundColorAction = UIAlertAction(title: "Red", ↲
style: .default, handler: { (alertAction: UIAlertAction) in
self.view.backgroundColor = .red
})
let greenBackgroundColorAction = UIAlertAction(title: "Green", ↲
style: .default, handler: { (alertAction: UIAlertAction) in
self.view.backgroundColor = .green
})
let blueBackgroundColorAction = UIAlertAction(title: "Blue", ↲
style: .default, handler: { (alertAction: UIAlertAction) in
self.view.backgroundColor = .blue
})
return [redBackgroundColorAction, greenBackgroundColorAction, ↲
blueBackgroundColorAction]
}

Der Zweck der Actions ist es, die Hintergrundfarbe des View Controller zu verändern, in dem sie entstehen. So gibt es je eine Action zum Ändern der Farbe nach Rot, Grün und Blau. Um den Code übersichtlich zu halten, werden die Actions in einer eigenen Methode changeColorActions() erstellt, und als Array vom Typ [UIAlertAction] zurückgeliefert.

Um Actions zu einem UIAlertController hinzuzufügen, kommt die Methode addAction(_:) zum Einsatz:

func addAction(_ action: UIAlertAction)

Entwickler müssen die Methode für jede Action, die sie einem Alert hinzufügen möchten, einmal aufrufen. Einen Ansatz, der direkt ein Array mit mehreren Actions übernimmt, gibt es leider nicht. Daher nutzt man idealerweise eine for-in-Schleife für diesen Fall. Verfügt ein Alert lediglich über eine Action, lässt sich addAction(_:) direkt aufrufen.

Der folgende Codeauszug zeigt, wie eine for-in-Schleife die zuvor erstellten Actions aus der Methode changeColorActions einer UIAlertController-Instanz hinzufügen können:

for action in changeColorActions() {
alertController.addAction(action)
}

Wenn das Programm Alert Controller über die Methode present(_:animated:completion:) der Klasse UIViewController anzeigt, erscheinen die hinzugefügten Actions automatisch in Form von Schaltflächen. Betätigt ein Nutzer einen der Buttons, führt die Anwendung anschließend den Code aus, der der entsprechenden Action als handler-Parameter übergeben wurde.

Wenn ein Alert über eine Action verfügt, die als Standardoption dienen soll, können Entwickler sie explizit als sogenannte Preferred-Action definieren. Das hat zur Folge, dass das System die Action sowohl optisch hervorhebt als auch direkt ausführt, wenn der Nutzer die Return-Taste drückt.

Um einem Alert Controller eine solche Preferred Action zuzuweisen, ist ihm die Action zunächst durch die Methode addAction(_:) hinzuzufügen. Anschließend muss sie in der Eigenschaft preferredAction des Alert Controllers ergänzt werden. Dabei handelt es sich um ein Optional, das standardmäßig nil entspricht.