【发布时间】:2010-07-15 03:30:57
【问题描述】:
我正在尝试为游戏创建一个多视图控制器,其中一个根视图控制器在切换到另一个视图之前释放视图。反过来,子视图控制器本身就是子根视图控制器,因为它们包含其他视图控制器。
例如,我的 singlePlayerViewController 将有一个shakeObjectViewController 可能还有其他。使用操作表在视图之间切换,将应用程序委托作为操作表的委托,从 singlePlayer 视图切换到另一个视图时,一切都按预期工作。
但是当我尝试使用相同的 init 方法创建一个新的 singlePlayerViewController 时,当我尝试插入一个子视图(即shakeObjectViewController.view)时,调试器会抛出一个 EXC_BAD_ACCESS 错误。
目前的初始化是这样的: 应用委托使用默认的 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];
然后在切换回单人模式时,执行rootViewController.m的viewDidLoad中同样的init方法,调试器在“[self.view insertSubview:singlePlayerViewController.view atIndex:0];”上抛出错误行。
关于为什么没有创建新视图的任何想法?我尝试将 singlePlayerViewController 设置为 nil 而不是释放,但随后在“self.view = shakeController.view;”上抛出错误线。 我的理解是,如果视图属性当前为 nil,则在下次访问视图时会自动为您创建一个新属性。
initWithNibName 是否只意味着执行一次?还是我的设计方式在 # 视图控制器方面过于复杂?
【问题讨论】:
标签: iphone cocoa-touch