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. Здесь, если вы хотите перейти от одного представления к другому представлению через панель вкладок, вы должны использовать UINavigationController в Mainwindow.xib и соединить его viewController с делегатом приложения.

person kulss    schedule 13.09.2011