Повторная инициализация контроллера просмотра - iPhone
-
06-07-2019 - |
Вопрос
У меня есть многовидовое приложение с отдельными 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, когда игра заканчивается, и перехожу к экрану оценки.Я хочу, чтобы пользователь перезагрузился и вернулся в игру, т. е. загрузил UIViewController с приведенным выше кодом, но начал с новой игры, все настройки находятся в вызываемом методе.Я мог бы просто установить переменную и передать ее между UIViewControllers, но я думал, что может быть команда, которая позволила бы мне сбросить игровой UIViewController, чтобы он ничего не помнил о состоянии в конце последней игры.
Чтобы заставить это работать, я написал метод для сброса всех переменных в UIView, который отображает экран игры, и вызываю этот метод из UIViewController в разделе viewDidLoad.
Решение
Я предполагаю, что в вашем представлении отображаются некоторые данные, хранящиеся в модели (игровое состояние).Так разве вы не хотели бы сбросить состояние игры и позволить просмотру отображать его?Представление управляется (загружается / освобождается / перезагружается) системой, когда его необходимо отобразить или освободить при нехватке памяти на телефоне.Поэтому, если вы обрабатываете свое игровое состояние отдельно, вам следует обновить игровое состояние (модель) и позволить представлению отображать его.
Что вы имеете в виду под моим "вызывающим видом"?Вы имеете в виду, когда вы переходите из "меню" на "игровой экран"?
Возможно, помогла бы повторная загрузка состояния игры после отображения представления.Есть такие делегаты , как viewDidLoad Загрузить но, насколько я понимаю, они вызываются после загрузки представления.Однако, если у вас заканчивается память, ваше представление может быть выпущено и перезагружено позже, поэтому, я думаю, вам следует самостоятельно управлять игровым "состоянием" в model object и позволить представлению просто отображать его.
Не уверен, поможет ли это, я не совсем уверен, что вы имели в виду, когда я "вызывал представление".
Другие советы
Вместо того чтобы отслеживать, какой вид отображается в данный момент, используйте 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, поэтому я не уверен.Но я думаю, что это сработало бы.