使用 Storyboard 调味 Objective-C iOS 应用

Flavouring Objective-C iOS app with Storyboard

我在 Objective-C 中有一个带有故事板的 activity iOS 应用程序。该应用程序有两个构建方案,例如方案 1 和方案 2。视图只有几个按钮。我想根据构建方案区分这些按钮的颜色。

我是 iOS 世界的新手,但我很难根据构建方案对故事板进行参数化(例如颜色、字符串等)。我知道 ,但我想要更明确的内容。

感谢您的帮助。

Xcode 不支持使用 Schemes 进行条件编译。为此,您需要维护两个目标,这很快就会变得混乱。

要使用 Schemes 做到这一点,您需要维护两个具有正确命名颜色的资产目录,并在构建时复制正确的一个。源 .xcasset 目录不会添加到您的目标。

您需要在目标的“构建阶段”部分尽早添加 运行 脚本

幸运的是,方案名称是通过 CONFIGURATION 环境变量表示的。你可以这样做,你的路径可能会有所不同:

# Copy over the appropriate asset catalog for the scheme
target=${SRCROOT}/Resources/Colors.xcassets

if [ "${CONFIGURATION}" = "Scheme 1" ]; then
sourceassets=${PROJECT_DIR}/Scheme1.xcassets
else
sourceassets =${PROJECT_DIR}/Scheme2.xcassets
fi

if [ -e ${target} ]; then 
echo "Assets: Purging ${target}"
rm -rf ${target}
fi

echo "Assets: Copying source=${sourceassets} to destination=${target}"
cp -r ${sourceassets} ${target}

本质上,您是将资产目录的编译版本替换为您的 Scheme 特定版本之一。

字符串是另一个问题,您可以使用相同的技术来处理本地化字符串。

这一切很快就会变得糟糕,不推荐使用。使用 中描述的技术通过代码在运行时配置 UI 是更好的选择。

您可以构建一个填充层来保护您的代码免受 Scheme 更改的影响。

例如

@interface MyColors : NSObject

+ (UIColor *)buttonBackground;

@end

@implementation MyColors

+ (UIColor *)buttonBackground {

#if SCHEME1
    return [UIColor colorNamed:@"scheme1ButtonBackground"];
#else
    return [UIColor colorNamed:@"scheme2ButtonBackground"];
#endif

}

@end