我有一个iPhone项目,我正在创建一个免费的/ lite版本。我创建了第二个目标,此时我正在尝试处理每个目标所具有的不同接口。在目标之间几乎所有视图都会有所不同,因为它们至少会在顶部有一个adView。但是,有些观点在不同方面有所不同。
我想知道是否可以为每个要加载的视图控制器创建两个具有相同名称的xib。 lite xib将进入它自己的目录,我只会将它添加到lite目标的bundle中。由于存在单独的bundle,我认为如果正确的xib在正确的bundle中,我就不必区分我想加载的xib代码。
我正在尝试使用xcode 4.2执行此操作,但当我尝试打开具有相同名称的第二个xib时xcode崩溃。
提前感谢您的帮助。
答案 0 :(得分:5)
更好,更明智的方法是命名为一个xib文件提供完整版本名称,另一个xib文件为lite名称。例如。 “MyGreatAppView-Full.xib”和“MyGreatAppView-Lite.xib”。
以编程方式实例化视图控制器时,可以传递的参数之一是要加载的XIB名称。
E.G。
MyGreatAppViewController * appVC;
#if LITEVERSION
appVC = [[MyGreatAppViewController alloc] initWithNibName: @"MyGreatAppView-Lite.xib" bundle: nil];
#else
appVC = [[MyGreatAppViewController alloc] initWithNibName: @"MyGreatAppView-Full.xib" bundle: nil];
#endif
您想到的另一个想法是保持xib文件的名称相同,这取决于将xib文件保存在单独的文件夹中,并希望XCode不会混淆。 XCode 3相当不错。 XCode 4,至少对我而言,并不是最稳定的野兽。
答案 1 :(得分:3)
是的,你可以。创建新目标时,它会在项目文件夹中创建一个新目录,这样可以轻松地为多个文件创建相同的文件名。 当您添加新的或旧的接口文件(实际上是任何文件)时,Xcode会询问您要添加的目标。只需检查要添加的目标。 您可以在Target / Build Phases / Bundle Resources
中手动管理文件我已经制作了许多免费版本,这就是我通常做的事情:
为免费版
删除除appname-info.plist文件以外的所有已添加文件。
将所有常见源文件添加到目标Target / Build Phases / Compile Resources(可以从导航器中拖放)
将所有常见的其他文件(图标等)添加到目标目标/构建阶段/捆绑资源(可以从导航器中拖放)
添加所有必需的框架(可以从导航器中拖放)
在我想要更改的界面文件上单击左键/在Finder中显示。将文件复制到项目中新创建的目录
将复制的接口文件从Finder拖到Xcode并将其放入新创建的目标组中。取消选中“将项目复制到目标组”,因为它已存在。确保在“添加到目标”
它也适用于其他所有图标,图像,视频等。如果你避免硬编码名称,它就像一个魅力。 我有多达6个目标(3个完整版,3个免费)的项目,它们共享相同的代码,但不同的xib,图标和多媒体文件。 我通常根据应用程序是否为free / lite而删除限制,使用以下代码(Mac,对于iOS,只需删除徽章设置行):
NSString *appName = [NSString stringWithString:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]];
if ([appName rangeOfString:@"Lite"].location != NSNotFound || [appName rangeOfString:@"lite"].location != NSNotFound) {
//put lite badge on
NSString *badgeText = @"lite";
[[NSApp dockTile] setBadgeLabel:badgeText];
fullVersion = NO;
} else if ([appName rangeOfString:@"Free"].location != NSNotFound || [appName rangeOfString:@"free"].location != NSNotFound) {
//put free badge on
NSString *badgeText = @"free";
[[NSApp dockTile] setBadgeLabel:badgeText];
fullVersion = NO;
} else {
fullVersion = YES;
}
答案 2 :(得分:0)
我认为您不能对不同的xib文件使用相同的名称。构建应用程序后,您会发现所有xib文件都编译为nib并放在同一目录中(在主程序包中)。但是你可以使用不同的名字,if-else会有所帮助。
如果(liteVersion){ viewControll = [[YourViewController alloc] initWithNibName:@“YourViewController-Lite.xib”bundle:nil]; }其他{ viewControll = [[YourViewController alloc] initWithNibName:@“YourViewController.xib”bundle:nil]; }