在一个项目中有两个目标文件名相同的文件名appdelegate.h

问题描述:

是否有可能为不同的目标分离出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。然而,反过来只是建立好。

我该如何解决这个问题?

您应该为每个目标进行“构建阶段”,并确保您的每个目标都包含“编译源”下的相应应用程序委托。如果你给这两个应用程序代表不同的类,你也可能要改变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目标中。我也尝试了用户搜索路径排序。 –

一种方法是在目标的构建设置中添加一个“预处理器宏”,例如在您的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 

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

如果你有项目中有两个不同的构建目标,只需为不同的AppDelegate文件选择合适的目标成员即可指定构建中包含的不同文件。

对于不同的构建目标,有两个AppDelegate.m:首先,让您的AppDelegate.m只针对一个构建目标进行检查。第二,为了创建一个副本,去找到你的原始AppDelegate.m;创建子文件夹并在那里复制文件。 - 现在,在Xcode中创建引用:将文件拖到原始AppDelegate.m旁边的Xcode窗口中,选中“创建引用”并仅选择第二个构建目标。

在这一点上,你应该有两个AppDelegate.m在你的项目中彼此相邻。