2013-10-02 7 views
6

Ich habe versucht, einen Viewcontroller B in Navigation Controller von A und dann einige Eigenschaften von B in A.
In diesem Fall wurde die Zuweisung von Eigenschaften getan und dann ViewDidLoad von Viewcontroller A wurde ausgeführt.ViewDidLoad wird langsam ausgeführt, während Viewcontroller gedrückt wird

Hier sollte die Zuweisung von Eigenschaften in A erst nach Ansicht von ViewDidLoad von A erfolgen.

Zum Beispiel

[b.navController pushViewController:a animated:YES]; 
a.status = @"loaded"; 

Hier wurde Status zuerst zugewiesen und dann viewDidLoad von A ausgeführt wurde. Dies geschieht nur in iOS 7, während es in iOS6 funktioniert.

Kann mir bitte jemand sagen, wo das Problem liegt?

UPDATE: Für mich in einigen Fällen in iOS7, Push-Ansicht funktioniert nicht. Wie kann ich es reparieren und reparieren?

+0

Können Sie etwas mehr Code zur Verfügung stellen? Möglicherweise gibt es noch etwas, das ViewDidLoad verursachen könnte: ausführen. – Abhinit

Antwort

1

Greifen Sie einfach auf die ViewController.view (setzen Sie alles, was unmittelbar nach dem Alloc) -Eigenschaft nach dem Alloc Init;

Welche wird loadview/viewdidload.
See Apple Documentation

0

Sie können wissen, wenn ein View-Controller auf den Stapel geschoben wurde durch die UINavigationControllerDelegate Implementierung und sich als Delegierter Einstellung self.navigationController.delegate = self; dann werden Sie diesen Rückruf erhalten nach jedem

navigationController:didShowViewController:animated: 

So schieben können Sie Überprüfen Sie, ob der angezeigte viewController der ist, an dem Sie interessiert sind, und legen Sie dann Ihren a.status fest.

-1

Ich verstehe Ihre Frage so bin:

B *b = [[B alloc] init]; 
b.status = @"loaded"; 
[self.navigationController pushViewController:b animated:Yes]; 

Wenn Sie einen Wert von einem Controller zu einem anderen Mittel übergeben möchten, müssen Sie Pushviewcontroller Methode einen Wert zuweisen, bevor Sie.

0

Bitte schreiben Sie den Code in viewWillAppear Methode anstelle von viewDidLoad in der nächsten Klasse das heißt, wo Sie das Objekt

-(void)viewWillAppear:(BOOL)animated 
{ 

} 
+0

Beachten Sie, dass viewWillAppear jedes Mal aufgerufen wird, wenn die Ansicht ..well - erscheint (kann mehrmals vorkommen) - und nicht nur einmal als viewDidLoad. – Lirik

+0

Ja, das ist richtig, Sie könnten eine globale Variable pflegen, die die Methode aufruft, aber aufgrund der Bedingung wird sie nicht ausgeführt. Ist viewwillAppear hilfreich für Sie, wenn ja, könnte ich Sie weiter für Code führen –

0

Keine Dokumentation genau zu wissen, bietet genügend Informationen drängen, wenn viewDidLoad würde aufgerufen werden.

UIViewController der Dokumentation sagt nur diese

Diese Methode wird aufgerufen, nachdem der View-Controller seine Ansicht Hierarchie in dem Speicher geladen hat

Ich würde vorschlagen, dass Sie einen benutzerdefinierten initializer wie diese

erstellen
- (id)initWithStatus:(NSString *)status { 
} 

Wenn Sie jedoch versuchen, diese Variable zu verwenden, um zu überprüfen, ob die ViewController-Ansicht geladen ist oder nicht Möglicherweise ist dies nicht möglich, da die Methoden pushViewController oder presentViewController nicht garantiert synchron sind.

Auch in iOS 6 gab es keine explizite Garantie, dass die Ansicht geladen würde, sobald diese Methode zurückgegeben wurde.

0

Ich würde vorschlagen, dass Sie eine Delegate-Methode aufrufen, sobald die Ansicht geladen ist. Legen Sie den Delegaten als Controller B fest. und nachdem viewDidLoad beendet ist (in Controller A), rufen Sie die Delegate-Methode auf. Sie können Parameter sogar wie gewünscht an den Delegierten übergeben.

Hier einige Beispiel-Code:

Steuerung B:

a.delegate = self; 
[b.navigationController pushViewController:a animated:YES]; 

die delegierte Methode implementieren:

- (void)controllerIsLoaded:(ControllerA *)controllerA status:(NSString *)status 
{ 
    a.status = status; 
} 

Steuerung A .h-Datei:

@class ControllerA; 

@protocol ControllerADelegate <NSObject> 
- (void)controllerIsLoaded:(ControllerA *)controllerA status:(NSString *)status; 
@end 

@interface ControllerA : UIViewController 

@property (nonatomic, weak) id <ControllerADelegate> delegate; 

Steuerung A .m-Datei:

- (void)viewDidLoad:(BOOL)animated 
{ 
    [super viewDidLoad:animated]; 

    /* your viewDidLoad code here... */ 

    if ([_delegate respondsToSelector:@selector(controllerIsLoaded:status)]) 
     [_delegate controllerIsLoaded:self status:@"Loaded"]; 
} 
1

Meiner Erfahrung nach einer UIViewController Ansicht ist träge, ganz gleich, geladen auf dem iOS-Version Sie arbeiten. Wenn Sie eine Viewload auslösen möchten und daher dessen UIViewControllerviewDidLoad, sollten Sie nach der Zuweisung des UIViewControllers auf die View zugreifen. Zum Beispiel:

UIViewController *aViewController = [[CustomViewController alloc] init]; 
[aViewController view]; 

Stellen Sie sicher, Sie codieren es nicht als

aViewController.view 

da, dass eine Compiler-Warnung erzeugen würde.

in Ihrem Fall also wäre es, so etwas sein:

... 
CustomViewController *a = [[CustomViewController alloc] init]; 
[b.navController pushViewController:a animated:YES]; 
[a view]; 
a.status = @"loaded"; 

Lassen Sie mich wissen, wenn Sie mit ihm weiter Probleme haben.

0

Schalten Sie Animation für ios7, in meinem Fall seine Arbeit

[b.navController pushViewController:a animated:NO]; 
a.status = @"loaded";