Я пытаюсь создать контроллер многооконного просмотра для игры, в которой один контроллер корневого представления освобождает представления перед переключением на другое представление. Контроллеры подчиненного представления, в свою очередь, сами являются подчиненными контроллерами представления, поскольку они содержат другие контроллеры представления.
Например, мой singlePlayerViewController будет иметь shakeObjectViewController и, возможно, другие. При использовании листов действий для переключения между представлениями с делегатом приложения в качестве делегата действий все работает, как и ожидалось, при переходе от представления singlePlayer к другому.
Но когда я пытаюсь создать новый singlePlayerViewController, используя те же методы init, отладчик выдает ошибку EXC _BAD
_ACCESS, когда я пытаюсь вставить подпредставление, а именно shakeObjectViewController.view.
На данный момент инициализация выглядит так:
Делегат приложения инициализирует окно с помощью метода init по умолчанию,
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Override point for customization after application launch
[window addSubview:rootViewController.view];
[window makeKeyAndVisible];
}
Затем в представлении rootViewController.m viewDidLoad,
if(singlePlayerViewController == nil) {
SinglePlayerViewController *singleController = [[SinglePlayerViewController alloc]
initWithNibName:@"SinglePlayerView" bundle:nil];
self.singlePlayerViewController = singleController;
[singleController release];
}
[self.view insertSubview:singlePlayerViewController.view atIndex:0];
Затем следует singlePlayerViewController.m,
- (void)viewDidLoad {
self.view.tag = kSinglePlayerView; // tag the view
ShakeObjectViewController *shakeController = [[ShakeObjectViewController alloc]
initWithNibName:@"ShakeObjectView" bundle:nil];
self.shakeObjectViewController = shakeController;
self.view = shakeController.view;
[shakeController release];
}
Обратите внимание, что мой singlePlayerViewController не вставляет подпредставления, а вместо этого заменяет свое собственное представление на представление контроллера подвида. (Не знаю, если это хорошая практика или нет:?:)
При переключении представлений делегат приложения выполняет следующее:
for(UIView *subview in [rootViewController.view subviews])
{
[subview removeFromSuperview];
}
[rootViewController.singlePlayerViewController release]
[rootViewController initMultiplayerView];
Затем при переключении обратно в однопользовательский режим выполняется тот же метод init в viewDidLoad rootViewController.m, и отладчик выдает ошибку в «[self.view insertSubview: singlePlayerViewController.view atIndex: 0];» линия.
Есть идеи, почему не создается новый вид? Я попытался установить для singlePlayerViewController значение nil вместо освобождения, но затем выдается сообщение об ошибке "self.view = shakeController.view;" линия.
Насколько я понимаю, если свойство view в настоящее время равно nil, то при следующем доступе к нему автоматически создается новое.
initWithNibName должен выполняться только один раз? Или мой дизайн слишком запутан с точки зрения контроллеров представления?