2011-10-26 122 views
3

我有一个iPhone项目,我正在创建一个免费/ lite版本。我创建了第二个目标,在这一点上,我试图处理每个目标都有的不同接口。就目标而言,几乎所有的观点都会有所不同,因为它们至少会在顶部有一个adView。然而,一些观点在几个方面有所不同。是否有可能在Xcode的一个项目中有两个具有相同名称的xib文件?

我想知道是否有可能为每个视图控制器加载创建两个具有相同名称的xib。 lite xib将进入它自己的目录,我只会将它添加到lite目标的包中。由于存在单独的捆绑包,我认为如果正确的xib在正确的捆绑包中,我不需要在代码中区分我希望加载的xib。

我试图用xcode 4.2来做到这一点,但是当我尝试用相同的名称打开第二个xib时xcode崩溃。

在此先感谢您的帮助。

回答

3

是的,你可以。当你创建一个新的目标时,它会在你的项目文件夹中创建一个新的目录,这使得多个文件具有相同的文件名是很容易的。 当您添加新的或旧的接口文件时,实际上是任何文件,Xcode会询问您要添加哪个目标。只需检查你想添加的目标。 您可以手动在目标管理文件/构建阶段/包资源

我已经做了一些免费版本已经这是我平时做:

  1. 的免费版本

    创建新的目标
  2. 删除appname-info.plist文件以外的所有文件。

  3. 所有常见的源文件添加到目标对象/编阶段/编译资源(可以将它从导航器拖放)

  4. 所有常见的其他文件(图标等)添加到目标对象/建造阶段/包资源(可以将它从导航器拖放)

  5. 添加所有必需的框架,在取景器上的接口文件,我想改变(可以拖放从导航器拖放)

  6. 左键点击/显示。将文件复制到项目中新创建的目录中

  7. 将复制的接口文件从Finder拖放到Xcode中,并将其放到新创建的目标组中。取消选中“将项目复制到目标组”,因为它已经在那里。确保如果你避免硬编码的名字,它就像一个魅力所期望的目标是“添加到目标”

它也适用于其他所有图标,图像,视频等下检查。 我有多达6个目标(3完整版本,3免费)共享相同的代码,但不同的xib,图标和多媒体文件的项目。 我通常删除基于应用程序是免费的/精简版或不与下面的代码限制(苹果机,适用于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; 
} 
+0

你说得对。我认为Xcode处于某种混乱状态,因为每次我试图拖拽一个与另一个相同名称的xib文件时(即使它位于不同的目录中),它都会给我一个崩溃警告。重新启动xCode后,一切都很顺利。我能够完全按照Tibidado的说法设置我的Lite版本。谢谢! – jmurphy

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文件在不同的文件夹和希望的XCode不会感到困惑。 XCode 3对此非常好。至少对我而言,XCode 4并不是最稳定的野兽。

+0

另一种方式来做到这一点(除'#如果... #endif'预处理器指令),特别是如果你想在同一个项目中为不同的目标包含不同的'xib',就是在'MyGreatAppViewController'中创建一个'nibName'或类似的方法, '.m'文件,每个都为自己返回正确的'NSString' xib文件名。您可以用这种方式一箭双雕:具有不同(或相同)行为的不同界面,您只需要担心捆绑在正确的版本中,而不需要预处理器进行定义。 – darvids0n

0

我不认为你可以使用相同的名称为不同的xib文件。构建应用程序后,您会发现所有的xib文件都被编译为nibs并放置在相同的目录中(在主包中)。但是你可以使用不同的名称,如果其他人会有帮助。


如果(liteVersion){ viewControll = [[YourViewController的alloc] initWithNibName:@ “YourViewController-Lite.xib” 束:无]; } else { viewControll = [[YourViewController alloc] initWithNibName:@“YourViewController.xib”bundle:nil]; }

+0

问题是关于在同一个Xcode项目中使用相同名称的xibs,不同的目标。不在同一个应用程序。 – djromero

相关问题