Interface Builder:根据目标选择媒体

时间:2010-11-07 08:36:48

标签: iphone objective-c ios interface-builder

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

。假装我定位JOHN并定位DOE。我可以向包中添加名为example.png的不同图像,并分别将每个图像作为目标。代码不需要这种方式进行任何更改。

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。因此,如果我正在处理目标JOHN,那么IB决定从example.png目标加载DOE是一种烦恼。

Interface Builder有什么方法可以根据目标加载媒体?

3 个答案:

答案 0 :(得分:1)

关闭此问题,答案是:

自2011年1月起,您无法在Interface Builder上加载基于目标的媒体,但您可以使用一些解决方法,如数字机器人和我在问题中描述的那样。

答案 1 :(得分:0)

为什么不在代码的开头定义

#ifdef JOHN
#define APP @"john"
#elseif DOE
#define APP @"doe"
#endif

然后,每次你想要使用它时,你可能会......

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

答案 2 :(得分:0)

那应该有用。这可能是新的,因为一段时间过去了,我最近刚刚学到了这一点。不知道多久以前你可能会问这个问题:)但是对于寻找解决方案的其他人来说这可能是有用的。

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

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

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