#iphone #objective-c #cocoa-touch
#iPhone #objective-c #cocoa-touch
Вопрос:
У меня есть приложение, которое имеет 4 вида; домашний просмотр, предварительный просмотр, просмотр игры, просмотр после игры. Приложение работает таким образом, что я запускаю с домашнего просмотра, затем нажимаю «Пуск», который приводит меня к просмотру перед игрой, нажимаю «Начать», который приводит меня к просмотру игры, по завершении игры я попадаю в просмотр после игры, из которого я могу либо вернуться к просмотру игры, либо вернуться к просмотру домашней игры.
Я распределяю эти представления с помощью метода «presentModalViewController». Но когда я прослою весь путь до PostGameView, а затем решу вернуться к HomeView, экран просто станет белым.
Я также пытался отклонять каждое modelview перед представлением следующего, но это не работает, и приложение становится запутанным. Кто-нибудь знает правильный способ сделать это? Пожалуйста, помогите?
HomeView.m
- (IBAction)loadPreGameView:(id)sender {
PreGameView *preGameView = [[PreGameView alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:preGameView animated:YES];
}
PreGameView.m
- (IBAction)loadGameView:(id)sender {
GameView *gameView = [[GameView alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:gameView animated:NO];
}
GameView.m
- (IBAction)loadPostGameView:(id)sender {
PostGameView *postGameView = [[PostGameView alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:postGameView animated:NO];
}
PostGameView.m
- (IBAction)loadGameView:(id)sender {
GameView *gameView = [[GameView alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:gameView animated:NO];
}
- (IBAction)loadHomeView:(id)sender {
HomeView *homeView = [[HomeView alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:homeView animated:NO];
}
Я также попробовал приведенный ниже для моего PostGameView.m, но он просто показал GameView за ним:
PostGameView.m (старый)
- (IBAction)loadGameView:(id)sender {
GameView *gameView = [[GameView alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:gameView animated:NO];
}
- (IBAction)loadHomeView:(id)sender {
[self dismissModalViewControllerAnimated:YES];
}
Ответ №1:
Гораздо лучшим подходом было бы использовать UINavigationController для этого.
Создайте UINavigationController, инициализируйте с помощью HomeView оттуда… [self.NavigationController pushViewController: анимированный nextViewController: НЕТ]
когда вы закончите и захотите перейти к началу [self.NavigationController popToRootViewControllerAnimated:НЕТ];
самое приятное в использовании NavController заключается в том, что каждый UIViewController автоматически будет иметь ссылку на NavController, содержащий его, путем вызова self.NavigationController;
вы также можете отключить панель навигации, если хотите использовать весь экран.
кроме того, UINavigationController сохраняет свои ViewControllers, поэтому вы должны вызвать release для любого созданного вами UIViewController после того, как вы его «нажмете».
Ответ №2:
У вас есть цепочка контроллеров просмотра. Вы должны отклонять на каждом уровне, чтобы вернуться к родительскому. Вы также можете подняться на несколько уровней и отклонить, и это приведет к появлению всех дочерних элементов ниже. У вас также может возникнуть ошибка памяти, поскольку вы должны автоматически выпускать контроллеры просмотра после их выделения или явного освобождения.
Комментарии:
1. Но когда я делаю
[self dismissModalViewControllerAnimated:NO]; GameView *gameView = [[GameView alloc] initWithNibName:nil bundle:nil]; [self presentModalViewController:gameView animated:NO];
в PreGameView.m — просмотр просто переходит из PreGameView обратно в HomeView, а не в GameView.