Iphone 界面生成器:根据目标选择媒体

Iphone 界面生成器:根据目标选择媒体,iphone,objective-c,ios,interface-builder,Iphone,Objective C,Ios,Interface Builder,在Xcode中,我使用targets发布了几个应用程序版本,它们共享一些基本代码,并且往往具有不同的图形 i、 e.假装我有targetJOHN和targetDOE。我可以将名为example.png的不同图像添加到bundle中,并将每个图像分别作为目标。代码不需要以这种方式进行任何更改 UIImageView *image = [UIImageView alloc] initWithImage:[UIImage imageNamed:@"example.png"]]; 如果取而代之的是,我

在Xcode中,我使用targets发布了几个应用程序版本,它们共享一些基本代码,并且往往具有不同的图形

i、 e.假装我有target
JOHN
和target
DOE
。我可以将名为example.png的不同图像添加到bundle中,并将每个图像分别作为目标。代码不需要以这种方式进行任何更改

UIImageView *image = [UIImageView alloc] initWithImage:[UIImage imageNamed:@"example.png"]];
如果取而代之的是,我按照不同的版本命名每个图像,我最终会得到类似的结果:

NSString *imageName;

#ifdef JOHN
imageName = @"johnExample.png";
#else
imageName = @"doeExample.png";
#endif
UIImageView *image = [UIImageView alloc] initWithImage:[UIImage imageNamed:imageName]];
拥有多个版本和多个图像,这很快就会变得混乱,拥有一个包含常量的大型文件在我看来就像是一个杀伤力过大的问题,所以我最终选择了第一个选项

问题是:

在处理nibs文件时,Interface Builder似乎只是随机加载
example.png
。因此,如果我在处理target
JOHN
的话,IB刚刚决定从
DOE
目标加载
example.png
,这是一个麻烦


Interface Builder有没有办法根据目标加载媒体?

为什么不在代码开头定义这个

#ifdef JOHN
#define APP @"john"
#elseif DOE
#define APP @"doe"
#endif
然后,每次你想用这个,你可能会

imagename = [NSString stringWithFormat:@"%@Example.png", APP];

为了结束这个问题,答案是:


从1月11日起,您无法在Interface Builder上加载基于目标的媒体,但您可以使用一些变通方法,正如Digital Robot和我在问题中的描述所指出的那样。

应该可以。这可能是新的,因为一段时间过去了,我最近才知道这一点。我不知道在很久以前,当你问这个问题时,这是否是可能的:),但它可能对其他寻找解决方案的人有用

将目标添加到xcode中的项目时,它会在文件系统中创建一个子文件夹。每个taragts都有一个子文件夹。据我所知,其基本思想是,所有常用文件都位于项目主目录的上层,而每个目标的单独文件都位于各自的目录中

(有点像文件的本地化版本。)

因此,您可以将John的图像作为example.png放在/project/John中,将Doe的图像作为example.png放在/project/Doe中。 您应该仔细检查每个图像的正确版本是否分别包含在每个目标的生成设置中。(复制边界资源)
这样做,“example.png”在边界中只包含一次。随机加载一个或另一个图像不应该再发生了,尽管您在代码中将其称为“example.jpg”

我想避免这样的事情,不过还是谢谢你。