是否可以针对不同的目标单独安装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
。但是,反过来只是构建好了。
我该如何解决这个问题?
答案 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彼此相邻。