【问题标题】:Flavouring Objective-C iOS app with Storyboard使用 Storyboard 为 Objective-C iOS 应用程序增色
【发布时间】:2020-06-26 15:54:59
【问题描述】:

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

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

感谢您的帮助。

【问题讨论】:

  • 您提到的帖子解释了使用预处理器宏来区分目标 C 代码中的方案所需的所有知识。除此之外,您还需要什么具体的东西?
  • @WarrenBurton 例如,我应该在哪里使用预处理器变量来选择要在情节提要中使用的颜色。
  • 好吧。使用一致的资产名称并将它们与宏分叉。稍后会解释更多。涨潮了,去冲浪吧。

标签: ios build-settings


【解决方案1】:

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

要使用方案执行此操作,您需要维护两个具有正确命名颜色的资产目录,并在构建时复制正确的一个。源 .xcasset 目录不会添加到您的目标中。

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

幸运的是,Scheme 名称是通过 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 特定版本之一替换资产目录的编译版本。

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

这一切都很快变得可怕,不推荐。使用your referenced post 中描述的技术在运行时通过代码配置 UI 会更好。

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

例如

@interface MyColors : NSObject

+ (UIColor *)buttonBackground;

@end

@implementation MyColors

+ (UIColor *)buttonBackground {

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

}

@end 

【讨论】:

  • 谢谢。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多