Подтвердить что ты не робот

Альтернативные способы программно управлять контроллерами представлений с помощью раскадровки

Я ищу альтернативные способы, чтобы программные контроллеры представлений, созданные на программном обеспечении. Я на самом деле нашел два пути, которые я использую, чтобы перейти к следующему виду, но также вернуться к предыдущему:

  • с помощью pushViewController:

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil]; 
    LocationWebView *lvc = [storyboard instantiateViewControllerWithIdentifier:@"LocationWebView"];
    [self.navigationController pushViewController:lvc animated:YES];
    
  • выполняет программную реализацию Segue:

    [self performSegueWithIdentifier: @"SongSegue" sender: self];
    

Есть ли у вас какие-то намеки на альтернативы и как лучше всего выполнить эту операцию? Обратите внимание, что я не имею в виду модальные представления.

4b9b3361

Ответ 1

Apple рекомендует использовать performSegueWithIdentifier:sender:someObject для программного выполнения сегментов. Есть несколько преимуществ для этого:

  • Меньше вашего собственного кода означает, что вы разрешаете инфраструктуре выполнять большую часть работы. Если Apple придумает какой-то сверхъестественный новый визуальный эффект для push segues или улучшит производительность или исправит ошибку в какой-то будущей версии iOS, ваше приложение сможет получить ее бесплатно. И каждая строка кода, которую вы пишете, чтобы работать с каркасом, могла бы сделать для вас, увеличивает вероятность написания ошибок.

  • Больше в IB может означать, что легче изменить. Если вы решите, что хотите изменить все свои нажатия на модальные сегменты или какой-то пользовательский тип segue, где вы делаете свой собственный супер-крутой визуальный эффект, вы можете выбрать "em all in IB" и изменить тип сегмента одним щелчком мыши вместо охоты в вашем коде.


Кроме того, используете ли вы первый или второй метод, нажатие контроллера представления для перехода "назад" на предыдущий контроллер представления не будет работать так, как ожидают ваши пользователи. Когда вы нажимаете SongViewController, он добавляется в конец стека навигации:

LocationViewController -> SongViewController

Если вы снова нажмете LocationViewController, чтобы вернуться назад:

LocationViewController -> SongViewController -> LocationViewController

Если пользователь нажимает кнопку "Назад" на панели навигации, они снова вернутся из представления местоположения в режим просмотра песни в окно местоположения. (Кроме того, если вы продолжаете делать это, каждый "назад" и "вперед" добавит к постоянно растущей цепочке контроллеров, что может привести к другим проблемам.)

Вместо этого вы должны вернуться к управлению контроллером навигации. Он помещает кнопку в навигационную панель для этой цели, которая должна обрабатывать большинство случаев использования. Если вам нужно сделать свой собственный контроль для возврата, вы не сможете сделать это в IB с iOS 5, но вы можете сделать это программно с помощью метода навигационного контроллера popViewControllerAnimated:.

Ответ 2

Лично я использую # 2, когда я нахожусь в UIViewController, который находится под UINavigationController. Я не думаю, что это сработает, там нет UINavigationController.

Когда я использую представление, находящееся под UITabBarController, я использую следующий код для перехода на другую вкладку:

NSUInteger tabIndex = 2; // Index of the tab I want to select
UIViewController * viewCtrl = [_tabController.viewControllers objectAtIndex:tabIndex];
_tabController.selectedViewController = viewCtrl;