重新初始化视图控制器 - iPhone

时间:2009-05-06 23:25:37

标签: iphone cocoa-touch memory-management uiviewcontroller

我有一个带有单独UIViewControllers和xib的多视图应用程序。我有一个视图是游戏视图,每次我调用它时我希望它重新初始化,我的意思是重新启动它的初始条件而不是我最后离开它的状态。

以下是我用来加载和删除视图的代码块:

-(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中绘制游戏屏幕的所有变量,并从viewDidLoad部分的UIViewController调用该方法。

2 个答案:

答案 0 :(得分:2)

我假设您的视图正在显示存储在模型中的一些数据(游戏状态)。那么你不想重置游戏状态并让视图显示出来吗?当手机上的内存不足时需要显示或释放视图时,系统会管理(加载/释放/重新加载)视图。因此,如果您单独处理游戏状态,则应更新游戏状态(模型)并让视图显示它。

你是什么意思我“打电话给观点”?你的意思是当你从“菜单”转到“游戏画面”时?

在显示视图后重新加载游戏状态会有所帮助。有一些代表喜欢 viewDidLoad ,但我的理解是它们是在加载视图后调用的。但是,如果你的内存不足,你的视图可能会在稍后发布并重新加载,所以我猜你应该自己在模型对象中管理游戏“状态”并让视图显示它。

不确定这是否有帮助,我不太清楚你的意思是什么'我称之为观点'。

答案 1 :(得分:0)

使用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所以我不确定。但我认为它会起作用。