在1个项目中为2个目标设置相同的文件名appdelegate.h

时间:2013-10-25 15:49:24

标签: ios xcode

是否可以针对不同的目标单独安装AppDelegate.h:iPhone / iPad?

我有一个默认的常见main.m:

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

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

我为每个iPhone / iPad文件夹中的每个目标正确设置了两个目标appdelegate.h / .m。

他们的头文件类似,当我构建iPhone目标时,它正在抱怨来自iPad appdelegate.h的Duplicate interface definition。但是,反过来只是构建好了。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分: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
}

虽然它看起来很笨拙,但是很多应用程序代表在两个平台上都是相同的,它引入了代码维护问题,以便有两个应用程序代表。

答案 1 :(得分: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

答案 2 :(得分:0)

我完全不知道iPhone和iPad目标,但

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

为不同的构建目标提供两个AppDelegate.m: - 首先,让您的AppDelegate.m仅检查一个构建目标。 - 其次,为了创建副本,请转到查找程序并查找原始的AppDelegate.m;创建子文件夹并将文件复制到那里。 - 现在,在Xcode中创建引用:将文件拖到原始AppDelegate.m旁边的Xcode窗口,选中“create reference”并仅选择第二个构建目标。

此时,您的项目中应该有两个AppDelegate.m彼此相邻。