iPhone拥有与一个视图控制器相关的两个视图

问题描述:

Blarg!iPhone拥有与一个视图控制器相关的两个视图

我试图开发一个类似塞尔达的游戏。 (即,当PC击中屏幕边缘时,屏幕切换到下一个视图,并且PC的位置在相应的边缘重新开始。)

我遇到的问题是我不想拥有因为所有数据/功能都存在于原始的“LevelView”控制器中,所以每个级别段都有多个视图控制器。如何保留这个“LevelView”控制器的代码,同时只切换NIB文件? (即我想要在那里的唯一类是AppDelegate,“LevelView”,“ItemView”等)。我不希望为游戏中的每个NIB文件重新创建视图控制器。

我很感激你可以提供的任何帮助!非常感谢你! :D

创建一个只包含新视图的NIB文件。将NIB文件中文件所有者的类更改为LevelView控制器的类。当您想要加载新的NIB文件时,请从LevelView控制器中调用以下代码:

NSArray *topLevelObjects = [[[NSBundle mainBundle] loadNibNamed:@"Put your nib file name here" owner:self options:nil]; 
UIView *newLevelView = [[topLevelObjects objectAtIndex:0] retain]; 

这是干什么的?当你调用loadNibNamed时,它会返回NIB文件中顶层对象的数组。 “文件所有者”和“第一响应者”代理对象不计为*对象。所以,你会得到一个只有NIB文件中顶层视图的数组。您将自己作为文件所有者传递,以便您在顶层视图的子视图和界面构建器中的“文件所有者”之间建立的任何插座连接都已连接。

如果您将顶层视图连接到视图控制器中的插座,则不需要对返回的数组loadNibNamed执行任何操作。只要忽略它,它就会自动释放(它会以保留计数0返回给您)。

现在,我认为这样做是一个坏主意。我认为有更好的方法来设计你的应用程序。例如,创建描述级别的数据文件(例如属性列表或XML文件)比将所有级别放入NIB文件更有意义。但是,如果你真的想这样做,上面的东西应该让你开始。

+0

嗯...当我把代码的上半部分,它仍然加载第二个视图,即使不必从数组中调用它。 (我把代码放在“ViewDidLoad”方法内部,也许这是为什么?)我喜欢这种将我的NIB引入数组的方法,所以我可以为每个“Map Segment”调用合适的字符应该是英寸再次,为什么新的视图加载甚至只有一半的代码写入?非常感谢您的帮助! :D – user298261 2010-09-28 23:30:44

+0

啊,明白了!将第二个视图附加为视图控制器的“视图”插座。我还在你写的第二行下面添加了“self.view = newLevelView”代码,因为编译器抱怨那个变量未被使用。再次感谢你的帮助! :D – user298261 2010-09-28 23:35:45

+0

Hmm ....所以每个视图都包含在它自己的数组中......每个数组都可以作为一个Dictionary内的对象存档...然后为角色所在的任何级别段调用正确的字典对象?这个逻辑是正确的吗? – user298261 2010-09-29 00:23:10

使用NSUserDefaults并从那里得到它。