2013-10-02 14 views
6

Próbowałem wypchnąć kontroler widoku B do kontrolera nawigacyjnego od A, a następnie przypisanie niektórych właściwości B w A.
W tym przypadku przypisanie właściwości zostało wykonane, a następnie viewDidLoad kontrolera podglądu A został wykonany.ViewDidLoad wykonuje powoli podczas pchania viewcontroller

Tutaj, przypisywanie właściwości w A powinno być wykonane dopiero po wykonaniu viewDidLoad z A.

Na przykład

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

Tutaj status został przydzielony, a potem viewDidLoad od A został stracony. Zdarza się to tylko w systemie iOS 7, natomiast w iOS6 działa dobrze.

Czy ktoś może dać mi znać, gdzie jest problem?

AKTUALIZACJA: W niektórych przypadkach w iOS7 widok Push nie działa. W jaki sposób cna go debuguję i naprawiam?

+0

można dostarczyć trochę więcej kodu? Może być coś, co może powodować viewDidLoad: do wykonania. – Abhinit

Odpowiedz

1

Wystarczy uzyskać dostęp do właściwości viewcontroller.view (ustaw dowolną rzecz zaraz po przydziale) po alokacji init;

Który będzie loadview/viewdidload.
See Apple Documentation

0

Można wiedzieć, kiedy View Controller został zepchnięty na stosie poprzez wdrożenie UINavigationControllerDelegate i ustawienie się jako delegata self.navigationController.delegate = self; wtedy dostaniesz Ta funkcja zwrotna po każdym naciśnięciem

navigationController:didShowViewController:animated: 

więc można sprawdź, czy pokazany viewController jest tym, który Cię interesuje, a następnie ustaw swój a.status.

-1

mi zrozumieć Twoje pytanie tak:

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

Jeśli chcesz przekazać wartość z jednego sterownika do innego środka, trzeba przypisać wartość przed użyciem metody pushViewController.

0

Proszę napisać kod w viewWillAppear metody zamiast viewDidLoad w następnej klasy to znaczy gdzie pchają obiekt do

-(void)viewWillAppear:(BOOL)animated 
{ 

} 
+0

Należy zauważyć, że viewWillAppear jest wywoływana za każdym razem, gdy widok ..well - pojawia się (może się zdarzyć wiele razy) - i nie tylko raz jako viewDidLoad. – Lirik

+0

Tak, to prawda, że ​​można utrzymywać zmienną globalną, która wywoła metodę, ale ze względu na warunek nie zostanie wykonana. Czy viewwillAppear jest dla ciebie pomocny, jeśli tak, mógłbym cię poprowadzić dalej w celu uzyskania kodu –

0

Brak dokumentacji zapewnia wystarczającą ilość informacji, aby wiedzieć dokładnie, kiedy viewDidLoad byłoby nazwać.

dokumentacja UIViewController jest po prostu mówi to

Ta metoda jest wywoływana po kontroler widok załadowaniu jej zdaniem hierarchii do pamięci

Proponuję utworzenie niestandardowego inicjator jak ten

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

Ale jeśli próbujesz użyć tej zmiennej, aby sprawdzić, czy widok viewController ma "załadowany", czy nie , może nie być to możliwe, ponieważ metody pushViewController lub presentViewController nie gwarantują synchroniczności.

Nawet w systemie iOS 6 nie było wyraźnej gwarancji, że widok zostanie wczytany zaraz po zwróceniu tej metody.

0

Proponuję wywołać metodę delegata po załadowaniu widoku. Ustaw delegata na kontroler B. i po zakończeniu viewDidLoad (w kontrolerze A) wywołaj metodę delegata. Możesz nawet przekazać parametry, jak chcesz delegatowi.

Oto niektóre przykładowy kod:

Controller B:

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

Wdrożenie metody Delegat:

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

Controller .h plików:

@class ControllerA; 

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

@interface ControllerA : UIViewController 

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

Controller A plik .m:

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

    /* your viewDidLoad code here... */ 

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

W moim doświadczenia, UIViewController widok jest ładowany leniwie, bez względu na to, która wersja iOS ty pracujesz. Jeśli chcesz wyzwolić ładowanie widoku, a tym samym jego UIViewControllerviewDidLoad, powinieneś uzyskać dostęp do widoku po przydzieleniu kontrolera UIViewController. Na przykład:

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

Upewnij się, że nie kodować go jako

aViewController.view 

ponieważ wygeneruje ostrzeżenie kompilatora.

Więc w twoim przypadku to musiałoby być coś takiego:

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

Daj mi znać, jeśli masz więcej problemów z nim.

0

Wyłącz animację dla ios7, w moim przypadku jego praca

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