2013-10-23 56 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

相關問題