2013-10-23 57 views
0

我们有一套共享一组通用屏幕的应用程序。某些屏幕在某些应用中比其他屏幕使用更多的功能。例如,在一个应用程序中,我们的问题屏幕支持标签,但在其他应用程序中则不支持。一方面,我们的区域屏幕支持工作流程,但其他方面则不支持。我可以在编译时检测项目中的文件吗?

我们正在使用的核心数据,以及不同的应用有不同的数据模型;如果实体未被应用程序的数据模型使用,则相应的类不会构建到该应用程序中。

这样做的结果是,一些我们的控制器的包含于可当控制器以特定的应用程序使用或可以不存在的类的引用。目前,我们在应用程序的PCH文件中使用“magic”#defines来解决此问题;因此我们的问题控制器中的一些代码被包装在#ifdef SGB_ISSUES_HAVE_TAGS中,并且我们的区域控制器中的一些代码被包装在#ifdef SGB_REGIONS_ARE_FILTERED_BY_WORKFLOW中。

我想什么是代替检测文件是否已被列入该项目做到这一点。因此,在我们的问题控制器顶部我有这样的事情:

#if exists_in_project("SGBIssueTag.h") 
#import "SGBIssueTag.h" 
#endif 

,然后我可以把#ifdef SGB_ISSUES_HAVE_TAGS到SGBIssueTag.h;我们构建的使用问题控制器的任何应用程序只要包含IssueTag实体就会获得问题标记功能,并且我们不必乱用PCH文件。

是这样的可能吗?

回答

0

这个问题已经被咬了很多人 - 的头文件的问题是“全球性”的项目。

我的建议是在编译过程中,试图武力错误。您可以添加PCH或其中包含的文件,为每个应用程序定义 - 可以说你有应用程序A,B和C.所以在任何一个版本中,只有其中一个是活动的。

然后,在每一个.m文件(可能还有一些.h文件),您将有条件地包括头:

... 
#if defined(A) || defined(B) 
#include "SomeInterfaceFile.h" 
#endif 
... 

一旦你开始建立一个,你会得到的文件编译错误,其中的源代码指的是在超出范围的头文件中定义的某个对象。这个代码你也必须包装在一个类似的if语句中。

这将很好地工作,用你的代码被这些条件语句凌乱的缺点。

+0

谢谢。这就是我现在所做的 - “我们在应用程序的PCH文件中使用”魔术“#defines解决了这个问题 - 我想知道是否可以根据Xcode项目的一部分自动完成比。 – Simon

相关问题