Лучший способ переключить View Controller в iOS
В моем проекте есть 2 диспетчера представлений. Внутренний контроллер просмотра1 Я хочу переключиться на View Controller 2 нажатием кнопки. В настоящее время я делаю это
- (IBAction)startController2:(id)sender {
viewController1 vc2 = [[viewController2 alloc] init];
self.view = vc2.view;
}
Кажется, что все работает нормально, но между нажатием кнопки и секундомером появляется большая задержка (4 секунды). Если я вызову viewController2 непосредственно из приложения AppDelegate, загрузка будет быстрее. Что я делаю неправильно здесь. Любая помощь приветствуется.
Ответы
Ответ 1
Несколько вещей, чтобы рассмотреть.
Часть 1: "Что я делаю неправильно здесь?"
-
Вы определенно не хотели делать self.view = vc2.view
. Вы просто положили один контроллер вида на другой вид контроллера. То, что вы, вероятно, хотите сказать, было [self.view addSubview:vc2.view]
. Это само по себе может решить вашу проблему, НО...
-
На самом деле не используйте это решение. Несмотря на то, что он почти непосредственно из образцов в некоторые популярные книги по программированию iPhone, это плохая идея. Прочтите "Нарушение UIViewControllers" , чтобы понять, почему.
Часть 2: Что вы должны делать
Все в главе "Представление контроллеров просмотра из других контроллеров просмотра" .
Это сведено к следующему:
-
a UINavigationController, (см. превосходное руководство Apple к ним здесь), а затем вы просто [navigationController pushViewController:vc2]
-
"управляемый вручную" стек контроллеров модального представления, поскольку andoabhay предлагает
-
явно добавляет VC как дочерний элемент другого, поскольку предлагает Джейсон
Ответ 2
Вы должны использовать UINavigationController
для переключения контроллеров представлений. Если целью вашего здания является iOS 5.0+, вы также можете использовать концепцию контейнера нового контроллера: [mainViewController addChildViewController:childViewController]
.
Ответ 3
Используйте presentModalViewController
следующим образом
[self presentModalViewController:vc2 animated:YES completion:^(void){}];
а в viewController1
используйте
[self dismissModalViewControllerAnimated:YES completion:^(void){}];
где вы хотите вернуться к предыдущему контроллеру.
Ответ 4
[VCA presentViewController:VCB animated:NO completion:nil];
[VCB presentViewController:VCC animated:NO completion:nil];
когда вы хотите удалить VCC, вы можете сделать это следующим образом
[VCA dismissViewControllerAnimated:NO completion:nil];
это блок-схема.
VCA → VCB → VCC
↑___________↓
Ответ 5
Вы должны использовать UINavigationController для переключения контроллеров представлений.
Вы находитесь в режиме просмотра1 и добавьте следующий код в метод нажатия кнопки.
View2 *View2Controller = [[View2 alloc] initWithNibName:@"View2" bundle:nil];
[self.navigationController pushViewController:view2Controller animated:YES];