Реинициализировать контроллер представления - iPhone - PullRequest
1 голос
/ 07 мая 2009

У меня есть приложение с несколькими представлениями с отдельными UIViewControllers и XIBS. У меня есть одно представление, которое является видом игры, и каждый раз, когда я его называю, я хочу, чтобы оно переинициализировалось, под этим я подразумеваю перезапуск в исходном состоянии, а не в том состоянии, в котором я последний раз его оставил.

Вот кодовый блок, который я использую для загрузки и удаления представлений:

-(void)loadStartViewController {
[currentView.view removeFromSuperview];
StartViewController *startViewController = [[StartViewController alloc] initWithNibName:@"StartView" bundle:nil];
[window addSubview:startViewController.view];
currentView = startViewController;

}

Я должен быть более ясным здесь. У меня есть UIViewController и XIB, которые составляют вид во время игры. Они вызывают метод в UIView, чтобы программно нарисовать представление. Когда игра заканчивается, я покидаю UIViewController и выхожу на экран счета. Я хочу, чтобы пользователь перезагружался и возвращался в игру, IE загружает UIViewController с вышеуказанным кодом, но запускает новую игру, все настройки в вызываемом методе. Я мог бы просто установить переменную и передать ее между UIViewControllers, но я думал, что есть команда, которая позволит мне сбросить игру UIViewController, чтобы она ничего не помнила о состоянии в конце последней игры.

Чтобы это заработало, я написал метод для сброса всех переменных в UIView, который рисует игровой экран, и вызова этого метода из UIViewController в разделе viewDidLoad.

Ответы [ 2 ]

2 голосов
/ 07 мая 2009

Я предполагаю, что ваш вид отображает некоторые данные, хранящиеся в модели (состояние игры). Так не хотите ли вы сбросить игровое состояние и позволить представлению отображать его? Представление управляется (загружается / освобождается / перезагружается) системой, когда его необходимо отобразить или освободить, когда на телефоне недостаточно памяти. Поэтому, если вы обрабатываете игровое состояние отдельно, вы должны обновить игровое состояние (модель) и позволить представлению отобразить его.

Что ты имеешь в виду, когда я называю взглядом? Вы имеете в виду, когда вы переходите из «меню» в «игровой экран»?

Может быть, поможет перезагрузка игрового состояния после отображения вида. Есть некоторые делегаты, такие как viewDidLoad , но я понимаю, что они вызываются после загрузки представления. Однако, если вам не хватает памяти, ваш вид может быть освобожден и перезагружен позже, поэтому я думаю, что вы должны сами управлять «состоянием» игры в объекте модели и позволить представлению просто отображать его.

Не уверен, поможет ли это, я не совсем уверен, что вы имели в виду, когда я называю "взглядом".

0 голосов
/ 07 мая 2009

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

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:startViewController];

Создайте переменную экземпляра в startViewController и передайте ей указатель на контроллер навигации после его создания. Затем, когда вы хотите пойти в игру:

[self.navigationController pushViewController:gameViewController animated:YES];

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

[self.navigationController setNavigationBarHidden:YES animated:NO];

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

[self.navigationController popToRootViewControllerAnimated:YES];

Да, а что касается повторной инициализации игры каждый раз, когда вы играете, просто введите

-(void)viewWillAppear:(BOOL)animated{}

в контроллере вида игры и делай любую инициализацию, какую захочешь. Хотя, честно говоря, я не на 100% уверен, что вы должны использовать это с .xib ... Я редко использую Interface Builder, поэтому я не уверен. Но я думаю, что это сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...