Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

App-Entwicklung mit iOS Grundkurs 1: Meine erste eigene App

Delegation

Testen Sie unsere 2013 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Die Softwaretastatur in der View einer App kann durch vielerlei Situationen ausgeblendet werden. Eine Technik dafür ist Delegation, was aber bei Weitem nicht darauf beschränkt ist. Delegation beschreibt, wie manche iOS-Objekte ein Ereignis "nicht behandeln", sondern einen Vertreter (den Delegate) damit beauftragen. Das Objekt, welches das Ereignis auslöst, benachrichtigt den Delegierten, dass ein Ereignis aufgetreten ist und der Delegat verarbeitet das Ereignis.

Transkript

Ein sehr wichtiges Konzept in der objektorientierten Programmierung oder, genauer genommen, in der Behandlung von Ereignissen in der objektorientierten Programmierung nennt sich Delegation oder auf Englisch "delegation". Dabei ist dieser Begriff nicht wirklich standardisiert. Sie sehen, wenn man hier Wikipedia betrachtet, dass in Sprachen wie C# und .NET oder in JAVA etwas anderes unter Delegation verstanden wird als beispielsweise in SWIFT, was wir bei iOS benutzen. Vereinfacht gesagt, bedeutet es aber in allen Fällen, dass die Ereignisse, die eigentlich einem Objekt A zugehörig sind, von einem Objekt B behandelt werden. Man reicht also die Verantwortung von einem Objekt an ein anderes Objekt weiter. Wie das syntaktisch nun genau gemacht wird, ist rein vom Konzept natürlich egal, aber wir müssen hier konkret in der iOS-Programmierung natürlich die Variante nehmen, die hier unter SWIFT und iOS von APPLE verwendet wird, also, was APPLE unter dem Delegationskonzept versteht. Es ist leider nicht ganz trivial und es fallen einige Dinge vom Himmel, die man einfach machen muss hier im SWIFT-Code im Wesentlichen, aber das Konzept erlaubt es beispielsweise dann auch, eine Tastatur, eine Softwaretastatur auf der View verschwinden zu lassen, obwohl eigentlich nicht das Objekt dieses Verschwinden oder auch Erscheinen auslöst, das konkret betroffen ist. Es hat die Verantwortung weitergegeben. Und nach dieser Vorrede möchte ich das mit Ihnen jetzt angehen. Ich habe hier eine Applikation, die dieses Keyboard anzeigt, sobald ein Anwender in diesem Textfeld, in diesem Text Field, hier etwas eingibt. Und die Tastatur soll nun verschwinden, sobald der Anwender die "Return"-Taste drückt. Das ist nicht standardmäßig gegeben erst einmal. Also derzeit, wenn ich hier den Simulator mal starte, taucht diese Tastatur auf, sobald ich hier in diesem Textfeld stehe. Und wenn ich jetzt "Return" drücke, dann passiert gar nichts. Die Tastatur bleibt, wie sie ist und es wird auch hier nichts im Label angezeigt. Das passiert erst dann, wenn ich hier auf diesen Button klicke. Das heißt, diese Situation soll jetzt so modifiziert werden, dass ich das Drücken der "Return"-Taste mit dem gleichzeitigen Verschwinden der Tastatur koppele. Das bedeutet, dieses Softwarekeyboard sendet ein Event an das Textfeld und über dessen Delegate kann dieses Event behandelt werden. Und jetzt wird es etwas "komplizierter", weil es muss einiges passieren im Code, das heißt, wir müssen hier einige Erweiterungen vornehmen, die nicht unbedingt vom Himmel fallen. Als allererstes muss man bei dieser Klasse "ViewController" sagen, dass diese als Delegate überhaupt arbeiten kann, Delegate für ein ganz spezifisches Objekt, in diesem Fall ein Text Field. Sie sehen hier eine Syntax und an dem Doppelpunkt, dass diese Klasse abgeleitet ist von "UIViewController". Das ist die Superklasse und das ist unsere Klasse, die als Controller in unserem MVC-System liegt. Man notiert hier ein Komma und gibt danach die Delegation-Klasse an. Man zeichnet damit die Klasse aus, mit Delegations umgehen zu können, die Methoden des Delegates benutzen zu können. Nun denken einige Programmierer mit Erfahrung in der objektorientierten Programmierung wahrscheinlich an Mehrfachvererbung, aber eigentlich gibt man hier mit diesem Komma nur eine Reihe von Delegation-Protokollen an, die hier behandelt werden können. Man kann hier mehrere Protokolle notieren. Wir wollen in diesem Fall nur genau eins notieren, das heißt, das, was ich hier notiere, ist als Protokoll zu verstehen, obwohl es auch natürlich eine Klasse ist. Aber eigentlich ist hier eine Art Schnittstelle, eine Art Protokoll, was wir notieren. Ich gebe also hier an: "UITextField" und wähle dann "delegate" aus. Die damit jetzt bereitgestellten Methoden sind optional. Die Aussage ist: Der View Controller kann ein Delegate für ein Text Field sein. Er muss es nicht, aber er kann. Im nächsten Schritt müssen wir diesen View Controller als Delegate von einem Text Field auszeichnen. Das kann man auf verschiedene Weisen machen und eine Möglichkeit ist es, einfach hier in der Lademethode der App zu notieren. Man gibt das Textfeld selbst an. Und dafür steht nun eine Eigenschaft "delegate" zur Verfügung. Und dann weist man das Delegate zu, in diesem Fall "self". "Self" ist hier ein Verweis auf den aktuellen View Controller, für JAVA-Programmierer so was wie "this". Ein alternativer Weg führt über das Storyboard. Ich kommentiere mal diese Zeilen hier aus, die, wie gesagt, vollkommen korrekt sind, aber ich möchte jetzt noch das Storyboard kurz zeigen. Ich selektiere das Textfeld und schaue mir hier diesen Connections-Inspektor an. Nun sehen Sie hier, dass dieses Textfeld eine "delegate"-Property hat, eine Eigenschaft. Die haben wir eben im Code hier auch explizit gesetzt. Nun kann man hier dieses "delegate" ganz einfach mit der Maus auf den View Controller ziehen, denn dieser View Controller hier wird repräsentiert durch dieses Symbol, dieser Kreis hier. Klicken wir jetzt wieder auf das Textfeld. Und Sie sehen hier, dass die "delegate"-Eigenschaft auf den View Controller gesetzt ist. Und nun geht es zurück zum SWIFT-Code. Dieses manuelle Setzen der "delegate"-Eigenschaft vom Textfeld brauchen wir jetzt nicht mehr. Wir haben das über das Storyboard gesetzt, aber ich lasse es drin, damit sie diesen alternativen Weg sehen, über den Code die Zuordnung des Delegates vorzunehmen. Nun brauchen Sie noch eine passende Methode, um mit einem Delegate umzugehen. Und es gibt hier eine ganze Reihe von Methoden, die über dieses Protokoll zur Verfügung stehen. Wenn Sie hier auf diese Klasse klicken, dann sehen Sie hier in der "Hilfe", dass ich hier in dem "Utility"-Bereich jetzt diese "Hilfe" sichtbar habe. Wenn nicht, klicken Sie auf das Fragezeichen, dann ist der Help Inspector offen, dass Sie hier dann eine ganze Reihe an Methoden angezeigt bekommen. Sie können da durchscrollen, Sie können natürlich auch hier auf diese Hyperlinks klicken et cetera. Was wir jetzt konkret benutzen wollen, ist die Methode "textFieldShouldReturn". Das ist eine Methode, die einen Boolean-Wert zurückliefern kann, das sehen Sie hier. Dieser Boolean-Wert sagt entweder, dass das Default-Verhalten von einem Textfeld beibehalten werden soll oder eben nicht. Dann gibt man hier "false" an. Das werden wir gleich machen. Wir überschreiben also quasi diese Methode hier, dann machen wir das hier, und schreiben hin: "textFieldShouldReturn". Nun stellt sich die Frage, was wir in dieser Methode hier tun wollen. Nun, wir wollen unser Text Field zum Fast Responder machen, also "textField. resignFastResponder". Und Sie sehen, dass es hier noch ein Problem gibt. Das liegt daran, dass wir einen Boolean-Wert zurückliefern müssen. Und wir haben uns ja dafür entschieden, hier "false" zurückzugeben, damit nicht das Default-Verhalten von dem Text Field beibehalten wird. Wir können jetzt diese App mal ausführen. Wenn ich also hier in das Textfeld klicke und da irgendwas eintrage, kann ich mit Auslösen von "Return" die Tastatur verschwinden lassen. So weit eigentlich ganz nett. Es gibt nur eine Unschönheit, nämlich, dass hier "Return" als Taste benutzt wird, ist nicht natürlich. Wenn man ein Textfeld verlässt, möchte man eigentlich sagen: "Fertig." Und auch so etwas können wir jetzt hier einstellen, wir können etwas modifizieren. Und zwar, wenn wir zum Storyboard gehen, dann das Textfeld wieder auswählen und im Inspektor schauen, dann gibt es ja hier eine ganze Menge Möglichkeiten, was man einstellen kann, unter anderem auch: Was ist der "Return Key" für dieses Widget, dieses Element? Und statt "Default" könnte man hier auf "Done" umstellen. Wenn wir jetzt die Applikation wieder ausführen, dann werden Sie sehen, dass dieses "Return", was wir eben gesehen haben, durch "Fertig" ersetzt wurde, natürlich nur bei einem deutschen Tastaturlayout. Wenn wir hier ein englisches Tastaturlayout haben, dann würde dort "Done" stehen. Fassen wir zusammen: Sie müssen vor allen Dingen bei der Verwendung von Delegates erst einmal der Klasse ein Protokoll hinzufügen, damit der Controller überhaupt als Delegate arbeiten kann. Dann suchen Sie sich eine passende Methode heraus, die über ein Protokoll für ein spezielles Element verfügbar gemacht wurde. Und dann notieren Sie das, was von diesem Delegate ausgeführt werden soll. Beispielsweise können Sie die Softwaretastatur verschwinden lassen, aber das ist nur eine von vielen Möglichkeiten. Ihrer Fantasie ist da vollkommen freier Lauf gelassen.

App-Entwicklung mit iOS Grundkurs 1: Meine erste eigene App

Ihr Einstieg ohne Vorwissen: Unternehmen Sie die ersten Schritte zur eigenen iOS-App.

2 Std. 8 min (21 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Hersteller:
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:05.05.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!