2010-12-03 10 views
15

In einer UIViewController Unterklasse, habe ich die folgenden Methoden:UIViewController: viewWillAppear heißt, viewDidAppear nicht

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    // do something 
    myTextField.text = @"Default"; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    // do something 
    [myTextField selectAll:self]; 
    [myTextField becomeFirstResponder]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad];  
    // do something 
    myTextField.delegate = self; 
} 

Die NIB wurde Interface Builder erstellt. Das entsprechende View-Controller-Objekt wird vom Navigationscontroller über pushViewController geschoben.

Das beabsichtigte Verhalten zeigt einen Standardtexteintrag in einem Textfeld an, um den gesamten Text auszuwählen und das Textfeld als Ersthelfer festzulegen. [Edit: Ich habe festgestellt, dass die Auswahl aller und erste Responder macht keinen Sinn, da die Auswahl würde verschwinden; dennoch frage ich mich, warum sich die Methoden so verhalten, wie weiter unten beschrieben.]

während Methoden viewDidLoad und viewWillAppear aufgerufen werden, wird die Methode viewDidAppear nicht aufgerufen. Kann mir jemand sagen warum? Die meisten Fragen, die ich im Web gefunden habe und hier mit viewWillAppear/viewDidAppear arbeiten, funktionieren nicht; Ich habe auch verstanden, dass diese Methoden in Subviews oder programmatisch erstellten Views nicht evoziert werden; Aber das gilt nicht für den Fall und ich frage mich auch, warum eine dieser "Lebenszyklus" -Methoden hervorgerufen wird und die andere nicht.

Irgendeine Idee? Vielen Dank!

Antwort

0

Der Anruf an viewDidAppear: sollte immer viewWillAppear: folgen, wenn Sie etwas Brauchbares tun, was Sie sagen, dass Sie nicht tun. Ich weiß nicht, warum es nicht funktioniert, aber hier sind ein paar Ideen:

Könnte es sein, dass Sie etwas Seltsames in einer der Delegate-Methoden für UITextFieldDelegate tun? Es ist unwahrscheinlich, dass es viewDidAppear: genannt würde, aber es könnte ein Täter sein.

Haben Sie eine Menge Dinge in den Speicher geladen, bevor Sie die Ansicht verschieben? Ich bin nicht sicher, was passieren würde, wenn Sie eine Gedächtniswarnung zwischen viewWillAppear: und viewDidAppear: bekommen würden.

Haben Sie versucht, einen Clean zu tun? Manchmal kann das helfen.

In Fällen wie diesen, wenn es funktionieren sollte, erstelle ich normalerweise eine neue Klasse und die Einführung der Funktionalität zu einem Zeitpunkt, um zu sehen, ob ich es auf diese Weise arbeiten kann. Ich habe Ihren Code in einem neuen navigationsbasierten Projekt ausprobiert, in dem ich eine neue UIViewController mit einer Steckdose in das Textfeld eingefügt habe. Dann habe ich den Code aus der Frage eingefügt und es hat wie erwartet funktioniert.

+0

Es sollte kein Speicherproblem auftreten, mindestens didReceiveMemoryWarning wird nicht aufgerufen. Eine saubere alle Ziele hat nicht geholfen. Also bin ich Ihrem Rat gefolgt und habe die Klasse in einem neuen Projekt schrittweise "kopiert". Und es funktioniert. : -/Ich habe alle Methoden hinzugefügt, die ich in meiner ursprünglichen Klasse überschreibe und in einem Projekt funktioniert es, in der anderen nicht. In beiden Fällen wird die Ansicht von pushViewController auf einem navcontroller angezeigt. Einziger Unterschied: Im Testprojekt gibt es einen navcontroller, in meinem Projekt gibt es drei (rootcontroller ist ein Tabbarcontroller) –

+0

@sven - Ich möchte die Titelansicht der Navigationsleiste ändern. Es scheint, dass die Ansicht noch nicht in die Navigationsleiste verschoben wurde, wenn viewWillAppear ausgelöst wird. – OmniBus

16

Ich hatte dieses Problem mit mir geschehen: viewWillAppear wurde aufgerufen, aber viewDidAppear war nicht!

ich heraus, schließlich dachte, dass dies, weil ich eine tabBarController hatte, wo ich selbst viewDidAppear es ist überlastet und vergessen die [super viewDidAppear:animated];

es in jedem Reiter jeden VC warf! Hinzufügen dieser Zeile zurück in behoben für meine anderen VC's.

Hoffe das hilft jemandem!

+0

Das war der genaue Fall für mich in meinem Swift-Projekt. Vielen Dank! –

0

Ich hatte das gleiche Problem.

Ich hatte kopieren/eingefügt viewDidAppear zu viewWillAppear erstellen, aber hatte vergessen, den super.viewDidAppear() Aufruf zu ändern. Dies schien dann zu stoppen viewDidAppear aufgerufen werden.

Es klingt wie irgendwo in Ihrem Code haben Sie einen Anruf an die Oberklasse verpasst oder vermasselt.

0

Dies kann daran liegen, dass Sie Ihrem übergeordneten VC unter viewDidLoad oder viewWillAppear einen untergeordneten Ansichtscontroller hinzugefügt haben. Die Erscheinung des Kindes verhindert den Anruf auf viewDidAppear.

Dies ist eine verrückte Sache zu tun, und ich weiß nur, weil dies ein Fehler in meinem Code war. Ich wollte das Kind-VC zu diesem VC hinzufügen, nicht das Eltern-VC.