Hilfe bei willMoveToParentViewController

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

  • Hilfe bei willMoveToParentViewController

    Aloha Gemeinde!
    Ich habe einen Viewcontroller (A) und einen zweiten (B).
    Nun ist es so, dass in A x-Buttons geladen werden, nachdem man einen fixen Button gedrückt hat. Das ganze nimmt eine gewisse Zeit in Anspruch, daher startet mit Button-Tap ein UIProgressView, damit der User weiß, dass er warten soll bis x-Buttons geladen sind.
    Drückt der User nun auf einen der vielen neu geladenen Buttons, so öffnet sich B mit entsprechenden Inhalt. B hat den Back-Button, womit der User direkt wieder zurück zu A kommt. Nun ist es so, dass dann auch gleich wieder die Button-Lade-Routine startet, die zuvor in A schon mal ausgelöst wurde. Das ist auch erwünscht. Nur verständlicherweise ladet UIProgressView nicht mehr, vielmehr hängt B erst mal, nachdem der Back-Button gedrück wurde und A erscheint erst, wenn alle Buttons geladen sind. Das ist nicht erwünscht bzw ich würde den User gern mitteilen, dass er kurz warten soll bis A wieder erscheint. Und hier ist das Problem was ich grad nicht lösen kann.

    Ich habe folgendes versucht:

    Quellcode

    1. //weiter oben
    2. UILabel * hideBackground;
    3. float width, height;
    4. -(void)viewWillAppear:(BOOL)animated
    5. {
    6. width = [[UIScreen mainScreen] bounds].size.width; //Display Width
    7. height = [[UIScreen mainScreen] bounds].size.height; //Display-Height
    8. hideBackground = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, width, height)];
    9. hideBackground.backgroundColor = [UIColorFromRGB(0xFFEB00) colorWithAlphaComponent:0.9f];
    10. [hideBackground setTextAlignment:NSTextAlignmentCenter];
    11. [hideBackground setTextColor:[UIColor blackColor]];
    12. hideBackground.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:12];
    13. hideBackground.text = @"Bitte warten...";
    14. }
    15. -(void)willMoveToParentViewController:(UIViewController *) parent
    16. {
    17. if(!parent)
    18. {
    19. NSLog(@"View B wird nun verlassen.");
    20. [[self view] addSubview:hideBackground];
    21. }
    22. }
    Alles anzeigen


    Das ganze klappt mit der NSLog meldung wie erwünscht. Also sobald der Back-Button gedrückt wird, erscheint das Log. Das Label allerdings nicht, sondern erst wenn ich von A wieder auf B gehe.
    Wo ist hier mein Denkfehler? Hoffe mir kann jemand helfen.
    Wenn dir das Leben Scheixxe schenkt, mach 'nen Schokokuchen draus.
  • Mir ist nicht ganz klar, warum Du willMoveToParentViewController: verwendest. Für mich hörte sich die Beschreibung nach einem NavigationController mit ViewController A an und ViewController B wird dann per pushViewController:animated: angezeigt. In diesem Fall wird willMoveToParentViewController: doch überhaupt nicht aufgerufen.

    Warum werden beim Anzeigen von ViewController A die Buttons immer wieder neu geladen und erzeugt? Lässt sich dies nicht optimieren?
  • Ja, es stimmt. Ich habe einen NavigationController mit ViewController A und B, letzteres wird via pushViewController:animated: aufgerufen.
    Warum sollte willMoveToParentViewController nicht aufgerufen werden, wenn bei A und B es sich um UIViewController handelt? willMoveToParentViewController ist doch eine Methode von UIViewController?! A ist dann auch das parent von B, oder habe ich da auch was nicht verstanden?
    Letzten Endes wird die Methode ja aufgerufen. :)

    Warum werden beim Anzeigen von ViewController A die Buttons immer wieder neu geladen und erzeugt? Lässt sich dies nicht optimieren?

    View A hat vier statische Buttons, die jeder eine x-Anzahl von neuen Buttons erzeugen (quasi wie ein Klappmenü). Ich möchte ja schon, dass das zuletzt ausgewählte "Untermenü" noch da ist, wenn der User von B zurück nach A kommt. Erzeugt werden die Unter-Buttons mit einer eigenen Methode in ViewController A, die im IBAction des jeweilen statischen Buttons aufgerufen wird. Wenn du magst, kann ich da mal ein paar Code-Schnipsel posten.
    Wenn dir das Leben Scheixxe schenkt, mach 'nen Schokokuchen draus.
  • Ich habe willMoveToParentViewController: bisher noch nicht verwendet und aus der Doku würde ich schliessen, dass die Methode nur bei einem eigenem Container View Controller aufgerufen wird, also im Zusammenhang mit addChildViewController:

    Mag natürlich sein, dass ein NavigationController auch addChildViewController: verwendet und willMoveToParentViewController: somit auch dort aufgerufen wird. Hast Du dies mal per Breakpoint oder NSLog Ausgabe getestet?
  • Erst Mal danke, dass du dir die Mühe machst mir zu helfen.

    dass die Methode nur bei einem eigenem Container View Controller aufgerufen wird

    Magst mir in diesem Zusammenhang mal Container erklären? Also wie ich mir das vorstellen soll. Steh da grad bisschen aufm Schlauch.

    Mag natürlich sein, dass ein NavigationController auch addChildViewController: verwendet und willMoveToParentViewController: somit auch dort aufgerufen wird.

    Nein UINavigationController verwendet kein willMoveToParentViewController. Diese Methode steht in der UIViewController-Klasse, welche doch über UINavigationController steht?!

    Hast Du dies mal per Breakpoint oder NSLog Ausgabe getestet?

    willMoveToParentViewController in View B wird sowohl aufgerufen, wenn ich von A zu B wechsle. Dann ist parent vom Typ UINavigationController. Wenn ich zurück von B zu A gehe, ist parent vom Typ UIViewController, aber nil. Kann ich doch daraus schließen, dass willMoveToParentViewController vererbt wird, oder?!
    Wenn dir das Leben Scheixxe schenkt, mach 'nen Schokokuchen draus.
  • Ich hab es mal mit viewWillDisappear versucht.

    Quellcode

    1. -(void)viewWillDisappear:(BOOL)animated
    2. {
    3. NSLog(@"Back Button was pressed.");
    4. [[self view] addSubview:hideBackground];
    5. }

    Hat denselben Effekt. Die Log-Ausgabe wird just zu dem Zeitpunkt erzeugt, an dem der Back-Button gedrückt wird. UILabel hideBackground erscheint aber erst ganz knapp bevor View A wieder da ist, lädt aber sicher 2-3 Sekunden zwischen Back-Button und addSubview. Nach meinem Verständnis muss es doch irgendwie an UILabel oder addSubview liegen.
    Wenn dir das Leben Scheixxe schenkt, mach 'nen Schokokuchen draus.
  • Letzterer Beitrag von mir funktioniert auf iPhone oder iPod, allerdings nicht auf dem Simulator. Habe nämlich immer auf dem Simulator getestet. Warum auch immer, auf einem richtigen Endgerät klappt es.
    Muss hinzufügen, dass das UILabel hideBackground in der viewWillAppear Methode dann wieder ausgeblendet werden muss, sobald es ein mal eingeblendet wurde. Hier der Code:

    Quellcode

    1. -(void) viewWillAppear:(BOOL)animated
    2. {
    3. if(hideBackground != nil)
    4. {
    5. [hideBackground removeFromSuperview];
    6. }
    7. }
    Wenn dir das Leben Scheixxe schenkt, mach 'nen Schokokuchen draus.
  • Warum verschiebst du deine Laderoutine nicht enfach vom viewWillAppeaer zum viewDidAppear?

    Dann must du überhaupt keine extra Wurst backen sondern alles klappt genauso wie du es willst automatisch.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

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