Как вызвать функцию при выходе из перехода?

В настоящее время мое приложение переходит из представления A в представление B через переход и выполняет некоторые функции в prepareForSegue. Что мне делать, если я хочу вызвать функцию, которая выполняется, когда представление B переходит к представлению A (после нажатия кнопки «Назад» на навигационном контроллере)?

Я предполагаю, что я мог бы сопоставить «кнопку «Назад» с IBAction, но я не уверен, как бы я это сделал, поскольку кнопка «Назад» является частью контроллера навигации и не видна непосредственно на раскадровке.

В частности, представление B обновляет некоторые значения, отображаемые в представлении A. Я хочу вызвать viewDidLoad, чтобы представление A имело обновленные данные перед загрузкой.

В контроллере представления ViewA:

// update view when it becomes visible
- (void)viewDidAppear:(BOOL)animated {
    [self viewDidLoad];
}

person kyothine    schedule 12.11.2012    source источник
comment
Да, вы не можете этого сделать. Смотрите мою правку...   -  person Fogmeister    schedule 12.11.2012


Ответы (2)


А, это не переход как таковой. Это эквивалентно popViewController.

Если вы хотите обновить вид, когда вид A становится видимым, вы можете сделать это в функции...

- (void)viewWillAppear:(BOOL)animated

или в функции

- (void)viewDidAppear:(BOOL)animated

Они будут запускаться каждый раз, когда представление становится видимым.

Здесь вы можете запустить свой метод «updateView» или любой другой метод, который вы хотите.

Если вы хотите передать данные обратно в представление A (т. е. представление B представляет собой представление «выбор города» или что-то в этом роде), вы показываете, что представление A является делегатом представления B. Таким образом, вы можете передать информацию обратно, когда пользователь что-то делает.

Вместо запуска viewDidLoad сделайте это...

- (void)viewDidLoad
{
    [self.button setTitle:@"blah"];

    [self updateView];
}

- (void)viewDidAppear:(BOOL)animated
{
    [self updateView];
}

- (void)updateView
{
    // do something that you want to happen
}

Хотя на самом деле вы не должны этого делать. Достаточно просто запустить [self updateView] из viewDidAppear.

Однако вы не можете запустить viewDidLoad напрямую.

person Fogmeister    schedule 12.11.2012
comment
Спасибо за ответ! Однако, похоже, это не работает полностью для моего приложения. Когда я перехожу из представления B обратно в представление A, похоже, что viewDidAppear не вызывается, но когда я перехожу из представления A обратно в главное меню (которое также связано переходом), это происходит. Как мне получить его, чтобы он работал более стабильно? - person kyothine; 12.11.2012
comment
Ваш переход от А к Б... это пуш-переход или модальный переход? Как вы едете из Б обратно в А? Вы используете кнопку «Назад» на панели навигации или делаете это в коде? Если вы делаете это в коде, можете ли вы вставить код? - person Fogmeister; 12.11.2012
comment
Это пуш-переход, и я возвращаюсь, используя кнопку «Назад» на панели навигации. - person kyothine; 12.11.2012
comment
Есть ли способ сделать [self.presentingViewController viewDidLoad] в коде контроллера View B? Кажется, это не работает. Я также пробовал self.parentViewController. - person kyothine; 12.11.2012
comment
Вы поместили viewDidAppear в свой вид A viewController? Он должен быть запущен, когда он снова появится. - person Fogmeister; 12.11.2012
comment
Я так и сделал, но код работает только тогда, когда я перехожу из вида B в вид A, затем в главное меню, а затем обратно в вид A. Он не работает, когда я перехожу из вида B в вид A напрямую. - person kyothine; 12.11.2012
comment
О, я думаю, вы используете viewDidLoad. Вы не должны использовать это. Это будет выполняться только один раз (т.е. при нажатии - при переходе из главного меню в A). Вы должны использовать viewDidAppear. Этого там нет по умолчанию, нужно туда вставить (просто в .м). - person Fogmeister; 12.11.2012
comment
Это то, что я сделал. Я добавил дополнительный viewDidAppear в свой файл .m, который вызывает viewDidLoad. Извините, если это было запутанно. - person kyothine; 12.11.2012
comment
Вам нужно использовать viewDidAppear, но вы не можете вызывать из него viewDidLoad. Вы никогда не должны запускать viewDidLoad самостоятельно. Если вам нужно сделать что-то в обоих, поместите это в функцию, например - (void)updateView, и запустите ЭТО из viewDidLoad и viewWillAppear. - person Fogmeister; 12.11.2012
comment
viewDidLoad используется для настройки вещей, которые не изменятся. Обычно объекты данных и т. д. (например, имя пользователя или заголовок кнопки и т. д.) viewDidAppear используется для выполнения действий, которые должны происходить каждый раз, когда вы переходите к представлению, например, обновление tableView или обновление метки. с последним временем и т. д. - person Fogmeister; 12.11.2012
comment
Я сделал то, что вы только что сказали, переместив свой код обновления в отдельную функцию и вызвав ее из viewWillAppear, и это не сработало. Та же проблема, что и раньше. - person kyothine; 12.11.2012
comment
Я ПОНЯЛ! Спасибо за вашу помощь. Мне нужно было добавить [viewA setNeedsDisplay], чтобы он работал. - person kyothine; 12.11.2012
comment
Не волнуйтесь, рад, что вы разобрались в конце концов :D - person Fogmeister; 12.11.2012

В контроллере представления «A» вам нужно реализовать метод prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender и внутри создать переходный контроллер targetView, вот пример:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
  if ([[segue identifier] isEqualToString:SEGUE_FOR_OPTIONS])
  {
     // Get reference to the destination view controller
      OptionsViewController *optionVC = [segue destinationViewController];
     [optionVC someMethod];
  } 
}
person Yuliani Noriega    schedule 12.11.2012