Iphone .nib文件的多个版本

Iphone .nib文件的多个版本,iphone,objective-c,ios,xcode,xcode4,Iphone,Objective C,Ios,Xcode,Xcode4,有没有办法让两个.nib文件同名?我使用的是Xcode 4,我希望在不同的文件夹中有多个版本的界面,即:main menu.xib,这样我就可以使用: [[MainMenuViewController alloc]initWithNibName:@“MainMenu”捆绑包:skinBundle] 其中,我的skinBundle将从路径中绑定: skinBundle=[NSBundle-bundleWithPath:[NSBundle-mainBundle]pathForResource:@“s

有没有办法让两个.nib文件同名?我使用的是Xcode 4,我希望在不同的文件夹中有多个版本的界面,即:
main menu.xib
,这样我就可以使用:

[[MainMenuViewController alloc]initWithNibName:@“MainMenu”捆绑包:skinBundle]

其中,我的
skinBundle
将从路径中绑定:

skinBundle=[NSBundle-bundleWithPath:[NSBundle-mainBundle]pathForResource:@“skinFolderPath”,类型为nil]

当我构建应用程序时,所有目录都被展平,结果只有一个
主菜单.nib
。当我将文件夹添加为文件夹引用时,目录树被保留,但没有.xib文件被编译为.nib


有没有办法实现这一点?或者更好的办法来管理多个版本的NIB?

您可以在Xcode中创建称为“资源包”的其他目标。这些目标具有包结构(如.app或.framework包)但不包含二进制代码。请将资源添加到这些捆绑包中,将这些目标的产品添加到主目标的“复制捆绑包资源”阶段,然后在实例化过程中使用这些捆绑包,代码如下:

NSString *skinBundlePath = [[NSBundle mainBundle] pathForResource: @"MyBundle" ofType: @"skin"]; // or whatever it's called
if (skinBundlePath) {
    NSBundle *skinBundle = [NSBundle bundleWithPath: skinBundlePath];
}
上面的代码段假设您将目标的包装扩展设置为“skin”,并将其命名为“MyBundle”

在Xcode 3(我手头没有4)中,您可以通过进入Project->New target来添加目标。从Mac OS X(即使您使用的是iOS)中选择“Loadable Bundle”(可加载捆绑包)。在我的脑海中,您不需要任何进一步的配置来让它工作,但您必须注意,在添加资源时,资源会进入正确的捆绑包


如果这听起来过于复杂,也可以创建一个新项目来构建一个可加载的捆绑包,并将其作为主项目的依赖项;同样,将子项目的构建产品添加到主项目的资源“复制捆绑包资源”中stage.

谢谢!这正是我想要的。在Xcode 4中,我通过在project Navigator->Add Target button->Mac OS X Framework&Library->bundle中选择project创建了捆绑包。然后我从应用程序的目标“Copy bundle Resources”中删除了所有资源文件下一步,我将bundle添加到应用程序的“目标依赖项”阶段,并将bundle从项目导航中的产品组拖动到“复制bundle资源”在主应用程序中。我必须补充一点,我必须更改捆绑包的目标构建设置:将基本SDK更改为
最新iOS
,将支持的平台更改为
iphonesimulator iphoneos
。否则,捆绑包产品将不会与主目标位于同一目录中。导致“复制捆绑包资源”错误阶段。我遇到的另一个问题是NIB在加载时缓存引用的图像,当我在两个不同的捆绑包中有两个同名的图像时,由于按名称缓存,将只显示一个图像。您有什么优雅的解决方案吗?使用
[NSImage imageNamed:
,而不是使用
[NSImage imagewithcontentsoff:]
。这在内存方面效率较低,但可以防止这种情况发生。