Вопрос

У меня есть многовидовое приложение с отдельными 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, поэтому я не уверен.Но я думаю, что это сработало бы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top