ViewDidAppear не се извиква в приложението, базирано на лентата с раздели

Аз имам проблем. Работя върху приложение, което е базирано на лента с раздели. В това приложение извикваме [self.view addSubview:newVC.view], когато искаме да преминем към нов изглед. newVC е контролерът на изгледа на новия изглед, който искаме да покажем. Също така използваме [self.view removeFromSuperview], когато искаме да се върнем към предишния изглед.

С други думи, няма навигационен контролер. Сега проблемът е, че искам да актуализирам предишния изглед. Тъй като използваме [self.view removeFromSuperview], viewDidAppear от предишния изглед не се извиква и затова няма начин да опресним този изглед.

Знам, че подходът, който използвахме, има недостатък, но тъй като това е широкомащабно приложение и промяната му за прилагане на навигационен контролер отнема много време, така че имам нужда да ми помогнете да намеря решението на този проблем. Как мога да извикам viewDidLoad или viewDidAppear или предишния изглед при извикване на [self.view removeFromSuperview] от неговия подизглед?


person Aqueel    schedule 13.09.2011    source източник
comment
мисля, че можете да опитате това [super viewDidLoad] преди [self.view removeFromSuperview]. Не съм опитвал това, но мисля, че ще свърши работа   -  person Mobile App Dev    schedule 13.09.2011
comment
НИКОГА не трябва сами да извиквате viewDidLoad. Това ще бъде извикано за вас, след като вашият изглед се зареди. Ще се случат ужасни неща, ако го извикате ръчно, особено ако изгледът всъщност не е зареден.   -  person Mike Weller    schedule 13.09.2011
comment
защо не вземете препратка към контролера на родителския изглед към подизгледа и не го манипулирате, като извикате метод, който прилагате, специфичен за нещата, които бихте искали да се погрижите за него?   -  person Saran    schedule 13.09.2011
comment
Благодаря много Саран. Това проработи.   -  person Aqueel    schedule 14.09.2011


Отговори (2)


Да, както каза Сара, трябва да имате препратка към предишния контролер в "стека". И когато "изваждате" контролера от стека, извикайте подходящия метод на предишния контролер. Разбира се, не трябва да извиквате viewDidLoad (не се извиква, когато извадите контролера от стека за навигация на реалния UINavigationController). Можете да извикате viewWillAppear или viewDidAppear, но по-добре използвайте свой собствен метод, като viewRevealed (можете също да го извикате от viewWillAppear или viewDidAppear). Полезно е да се направи базов клас, където да се реализира цялата тази функционалност и да се изведе целият контролер от базовия клас. Може да изглежда така:

- (void) pushViewController:(BaseViewController *)baseController{
  [self.view addSubview:baseController.view];
  baseController.parentController = self;
}
- (void) pop{
  [self.view removeFromSuperview];
  [self.parentController viewRevealed];
}
person Vladimir    schedule 13.09.2011

Извикване на метод viewDidLoad само когато преминете към контролер чрез метод pushViewController. Ако извикате removeFromSupreView, той ще извика метод viewWillAppear. Тук, ако искате да навигирате от един изглед към друг изглед през tabbar, трябва да използвате UINavigationController в Mainwindow.xib и да свържете неговия viewController с делегат на приложение.

person kulss    schedule 13.09.2011