2013-10-25 32 views
0

是否有可能爲不同的目標分離出AppDelegate.h:iPhone/iPad?在一個項目中有兩個目標文件名相同的文件名appdelegate.h

我有一個默認的共同的main.m:

#import <UIKit/UIKit.h> 

#import "AppDelegate.h" 

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
    } 
} 

我有2個目標的設置正確地在每個iPhone/iPad的文件夾中的每個目標的appdelegate.h/.M。

它們的頭文件類似,當我構建iPhone目標時,它從iPad appdelegate.h抱怨Duplicate interface definition。然而,反過來只是建立好。

我該如何解決這個問題?

回答

3

您應該爲每個目標進行「構建階段」,並確保您的每個目標都包含「編譯源」下的相應應用程序委託。如果你給這兩個應用程序代表不同的類,你也可能要改變main.m使用恰當的一項:

#import <UIKit/UIKit.h> 

#import "IphoneAppDelegate.h" 
#import "IpadAppDelegate.h" 

int main(int argc, char * argv[]) 
{ 
    @autoreleasepool { 
     if (NSClassFromString(@"IphoneAppDelegate")) 
      return UIApplicationMain(argc, argv, nil, @"IphoneAppDelegate"); 
     else 
      return UIApplicationMain(argc, argv, nil, @"IpadAppDelegate"); 
    } 
} 

就個人而言,我希望有一個單一的應用程序委託,並把條件檢查的iPhone/iPad的,例如,

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    // do iPad specific stuff 
} 

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 
    // do iPhone specific stuff 
} 

雖然它看起來未在這兩個平臺上,大部分應用程序代表都是相同的,它引入了一個代碼維護問題,以便擁有兩個應用程序代表。

+0

單個應用程序委託中if if語句太多,因此不使用單個文件。 –

+0

@NoraOlsen如果你想要兩個不同的應用程序委託類,你可以(a)爲你的目標各自的「編譯源」包含適當的一個;和(b)有主。m'抓住正確的一個。理論上你可以給它們起同樣的名字,但是在這種情況下,Xcode的一些用戶界面可能會感到困惑,所以獨特的名字可能會更好。 – Rob

+0

難道我不會因'redefinition'問題而結束,因爲我在main.m中包含了兩個頭文件?似乎我需要執行#if /#else以避免在main.m中與預處理器宏一起使用?即使沒有明確說明2個不同的頭文件名,Xcode將包含所有頭文件,因此我的iPad appdelegate.h包含在我的iPhone目標中。我也嘗試了用戶搜索路徑排序。 –

0

一種方法是在目標的構建設置中添加一個「預處理器宏」,例如在您的iPhone目標中放置「BUILD_FOR_IPHONE = 1」,並在您的iPad「BUILD_FOR_IPHONE = 0」中。然後你就可以在你的iPhone的AppDelegate.h添加以下

#if BUILD_FOR_IPHONE 
<your normal .h contents> 
#endif 

和iPad的

#if !BUILD_FOR_IPHONE 
.... 
#endif 
0

我不知道到底是iPhone和iPad的目標,但

如果你有項目中有兩個不同的構建目標,只需爲不同的AppDelegate文件選擇合適的目標成員即可指定構建中包含的不同文件。

對於不同的構建目標,有兩個AppDelegate.m:首先,讓您的AppDelegate.m只針對一個構建目標進行檢查。第二,爲了創建一個副本,去找到你的原始AppDelegate.m;創建子文件夾並在那裏複製文件。 - 現在,在Xcode中創建引用:將文件拖到原始AppDelegate.m旁邊的Xcode窗口中,選中「創建引用」並僅選擇第二個構建目標。

在這一點上,你應該有兩個AppDelegate.m在你的項目中彼此相鄰。

相關問題