2009-02-11 50 views
11

我有一个iPhone应用程序,具有不同的皮肤风格,不同的艺术资产和声音,但所有相同的代码。一个笔尖,不同的资产。捆绑?

我已经设置了多个目标,但我遇到的问题是我必须有一组不同的UIBuilder nib文件,每个目标每个视图一个,设置为指向正确的艺术那个目标。

这是一个有点沮丧,因为如果我做出改变,以一个笔尖的文件,我必须手动进行相同的更改,相同的连接等所有其他笔尖文件。我还将所有资产放在不同名称的不同皮肤中,以免它们在项目中发生碰撞。所以,如果我有目标,A和B,我有a_main_menu.pngb_main_menu.png ... a_FooViewController.xibb_FooViewController.xib ......等

有没有一种方法,使指向具有相同名称资产笔尖文件,但在...嗯,不同的捆绑?这是一个什么样的捆绑包?我可以想象在我的代码中修复类似这样的东西(可能在加载它之前在Nib中搜索并替换A for B甚至可能足够好),尽管我没有尝试过,但这很难看。

这对我的第一套应用程序来说是一个易于管理的策略(尽管远非最佳),但随着我的东西变得越来越复杂,它很难保持我的构建器文件同步,而且它不是一个非常干燥的方式上班。除了放弃uibuilder并在代码中创建视图之外,还有更好的方法吗?

这将是很好,如果这个工作在Xcode中/建设者的水平,所以建造者会尊重我的当前目标和展示艺术的,而我的工作是目标......不过我也许可以生活在没有,像如果我可以在运行时选择当前的一组艺术作品,而且我只能在制作工具中使用一组作品。我也可以用一组笔尖做一个单一的目标,并在建造之前手动替换所有的艺术品,但这也不是很好。

最重要的是,如果我可以混合使用这两种策略 - 就像如果我有了一个视图出来的几个,只是必须要异地布置一个目标......但这是可选的。

我在问正确的问题吗?

谢谢!

回答

1

假设每个应用程序只需一次一个皮肤,要创建不同主题的多个应用程序,我会在我的源代码管理创建一个分支,然后更换necesary资产。您使用所有默认资产保留主分支,然后将来自主服务器的代码更改合并到您的皮肤分支中,使所有内容保持同步。

Git使这非常简单。

0

我认为最好的选择是使用类似git的东西。

如果使用GIT中,可以有保持所述主源代码和逻辑主分支,和具有具有用于应用程序的每一个特定的味道不同的数据集/图像的子分支。在这个解决方案中,XCode甚至不知道发生了什么。

0

我认为这是viewDidLoad用于定制更多,在这里你可以改变图像路径。要做到这一点

5

一种方法是将所有你的作品移到单独的包和在运行时动态加载(有点像“媒体插件”)。

  • 创建一个单独的项目并选择“Mac OS X/Framework & Library/Bundle”。称它为media.bundle

  • 把你所有的作品到这个项目中。

  • 为了让生活方便,在您的主项目下增加一个额外的“运行脚本”一步向目标复制从构建目录内置输出到子文件夹。为了使它更容易,将媒体包添加为主项目中的相关项目,以便自动重建。

在您的主项目中,您将需要这两种方法。您可以在一个BundleUtils类它们的静态方法:

+ (NSString *) bundleDirectoryFor:(NSString *) bundleName 
{ 
NSString* basePath = [[[NSBundle mainBundle] resourcePath] 
    stringByAppendingPathComponent:[NSString 
           stringWithFormat:@"%@.bundle", bundleName]]; 
return [[NSBundle bundleWithPath:basePath] resourcePath]; 
} 

+ (NSString *) resourceInBundle:(NSString *)bundleName 
         fileName:(NSString *)fileName 
{ 
NSString *bundlePath = [BundleUtils bundleDirectoryFor:bundleName]; 
return [bundlePath stringByAppendingPathComponent:fileName]; 
} 

现在你想在你的包访问艺术品每一次,你可以得到的路径正确的文件有:

NSString* imageFile = [BundleUtils resourceInBundle:@"media.bundle" 
             fileName:@"image.jpg"]; 
UIImage* image = [UIImage imageNamed:imageFile]; 

显然,名称“media.bundle”可以在运行时替换为不同的名称,以便您可以根据应用程序的需要切换到其他包。这也是支持可下载内容的便捷方式(例如,用于付费附加组件)。

警告:这是假定你需要在运行时通过代码动态加载图像。但是你也有静态的NIB文件,其中嵌入了媒体。您必须找出一种方法来使静态NIB文件使用动态方法来解析媒体文件名称。一种方法是使用MethodSwizzling并观察带有类型前缀的文件路径,例如“media:image.png”,并重定向它们以使用BundleUtil方法。

另一种方式是与IB做你的布局,然后使用nib2objc将其转换为的OBJ-C代码,然后替换插件捆绑的机制。

希望这会有所帮助。

0

这对我有用:

1个项目。 2目标a,b。 a,b的2个图像文件夹。

controller.m及其nib文件适用于两个目标。

为目标a和b的图像创建单独的文件系统文件夹。

导入一个图像文件夹来定位(“添加文件到XY” - >“添加到靶标A/B”),其他的靶B。确保您使用“为添加的文件夹创建组”选项。不要选择“文件夹引用”选项。

当我建立靶向,我得到一个应用程序与文件夹从一个图像;当我建立b,它使用文件夹b的照片。