Multi viewController Delegate

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • Multi viewController Delegate

    Liebe Leute!

    Mir fehlen gerade leider die Ideen, wie ich eine bestimmte Anforderung umsetzen kann.
    Und zwar schreibe ich gerade mit meinem team an einer sehr umfangreichen App.

    Bei dieser App handelt es sich um eine spezielle Administrationsoberfläche.
    Wenn der User die App öffnet, so bekommt er die Möglichkeit, sich anzumelden und alles ist gut.

    Sollte das System, welches sich auf einem WebServer befindet, allerdings noch nicht eingerichtet sein, so soll sich ein Installationsassistent öffnen.
    Das habe ich an sich schon umgesetzt, ist ja auch nicht besonders tricky.

    Jetzt habe ich einen modalViewController (mainViewController) mit einem navigationController, und mehrere weitere viewController (inkl. xib) für die einzelnen Erinrichtungsschritte.
    Um den firstViewController am Ende der Einrichtung ("fertig") wissen zu lassen, dass alles geklappt hat (und ihm Informationen über die Einrichtung zukommen zu lassen) habe ich Delegate Protokolle benutzt.

    Jetzt habe ich jeden einzelnen viewController zum Delegate gemacht und um alles bis zum Anfang (den erste Delegate) durchzureichen, habe ich dann immer den Delegate "durchgereicht".
    Sprich:

    Quellcode

    1. ///////////////////// first.m /////////////////////
    2. - (IBAction)beginInstallation:(id)sender {
    3. secondViewController *second = [[secondViewController alloc] init];
    4. [second setDelegate:self];
    5. [self presentModalViewController:second animated:YES];
    6. }
    7. - (void)installerDidFinishWithSuccess:(BOOL)success andInfo:(NSDictionary *)infos {
    8. [self dismissModalViewControllerAnimated:YES];
    9. ///////////////////////////////////////////////
    10. ////////// Informationen verarbeiten //////////
    11. ///////////////////////////////////////////////
    12. }
    13. ///////////////////// second.m /////////////////////
    14. - (IBAction)goNext:(id)sender {
    15. thirdViewController *third = [[thirdViewController alloc] init];
    16. [third setDelegate:self.delegate];
    17. [self.navigationController pushViewController:third animated:YES];
    18. }
    19. ///////////////////// third.m /////////////////////
    20. - (IBAction)goNext:(id)sender {
    21. lastViewController *last = [[lastViewController alloc] init];
    22. [last setDelegate:self.delegate];
    23. [self.navigationController pushViewcontroller:last animated:YES];
    24. }
    25. ///////////////////// last.m /////////////////////
    26. - (IBAction)done:(id)sender {
    27. if ([self.delegate respondsToSelector:@selector(installerDidFinishWithSuccess:andInfo:)]) {
    28. [self.delegate installerFinishedWithSuccess:YES andInfo:(NSDictionary *)alleInformationen];
    29. }
    30. }
    Alles anzeigen


    Das funktioniert zwar im Prinzip...
    Allerdings bekomme ich so nicht nur Warnungen à la "Sending 'id<secondViewControllerDelegate>' to Parameter of incompatible type 'id<thirdViewControllerDelegate>'", sondern bin viel mehr der Überzeugung, dass das nicht so der richtige Weg ist. Ich kann mir einfach vorstellen, dass es da elegantere Methoden gibt.

    Auch habe ich schon an das NSNotificationCenter gedacht, allerdings halte ich notifications nicht so für den Brenner.
    Man hat mir auch schon oft (nicht zuletzt hier im Forum) absolut von notifications abgeraten und Delegate Protokolle empfohlen (die ich auch viel sexyer finde).


    Nun meine Frage:
    Hat vielleicht jemand von euch eine saubere Lösung für mich parat?
    Wie setzt man so was am schlauesten um? Sollte ich allen Delegate Protokollen den gleichen Namen geben (installerDelegate) ?!


    Danke für eure Hilfe, liebe Grüße
    Julian
  • Mach doch einfach eine Klasse "Informationen" und gib dann eine Instanz von dieser als Property von ViewController zu ViewController weiter. Dann kann jeder ViewController diese selber aktualisieren und am Ende hat der FirstViewController automatisch alle Daten die er braucht.

    Notificatrions finde ich übrigens eine super Sache und haben genauso Berechtigung wie Delegates aber in diesem Fall halte ich beide Lösungen für unnötig.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Klar, ich wollte ja jetzt nicht auf den Notifications herumhacken :D
    Aber ich war jetzt immer der Meinung, dass die nicht so geeignet sind, um große Datenmengen zu transportieren.

    Das ist auch 'ne ganz schlaue Überlegung...
    Aber wie sage ich denn dem firstViewController, dass im lastViewController der Button "fertig" gedrückt wurde?
    Oder sollte ich den viewController in diesem Fall sich selbst dismissen lannen?
    Das habe ich immer über den Delegate gemacht
  • julian.weinert schrieb:

    Gibt eigentlich keines...
    Da haste nicht ganz Unrecht, hab ich inzwischen auch so gemacht :)

    DANKE


    Hab ich schon. Nur hast du da wohl gerade auch geschrieben.

    Lass den secondViewController einfach den thirdViewController erstellen und sich selber danach dismissen. Fertig.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Jap — Hab meine Aussage noch mal korrigiert, in dem Moment, wo Du auch schriebst :))
    Nach Deiner kuhlen Idee mit der "Informationen" Klasse, ist klar, dass der aus auch getrost selber machen kann.

    Dann kann zwar der firstViewController zwar diese Infos zwar nicht mehr verarbeiten (da er ja ohne notifications o.ä. nicht wissen kann, dass der lastViewController fertig ist), allerdings ist das ja auch vollkommen egal.
    Das kann ja auch ruhig der lastViewController machen, theoretisch.

    Also noch mal danke für Deinen Denkanstoß :))
  • Nunja wenn sich der letzte ViewControler dismissed sollte dann ja wieder der erste erscheinen, da er der einzige ist der dann noch da ist. Also wird dort dann wohl viewWillAppear aufgerufen und dort kannst du abfragen ob alle notwendigen Daten in Deiner Information Klasse vorhanden sind. Wenn ja, dann war dein Assistent wohl erfolgreich, wenn nein, kannst ihn gleich wieder starten :)

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)