Apple现在为您提供了一个默认机制,以便在同一个项目中分离iPhone和iPad之间的代码。
在Xcode 4中,当您创建新的“基于窗口的应用程序”或“基于视图的应用程序”时,您可以选择选择“设备系列”。如果您为此选项选择“Universal”,则Xcode将创建3个应用程序代理。
首先,主应用程序的委托:
YourAppNameAppDelegate : NSObject <UIApplicationDelegate>
和另外两个应用程序代表(放置在不同的组)是“YourAppNameAppDelegate”的子类:
YourAppNameAppDelegate_iPhone : YourAppNameAppDelegate
YourAppNameAppDelegate_iPad : YourAppNameAppDelegate
当你运行你的应用程序无论是iPhone还是iPad模拟器(或设备),应用程序都会根据所选设备自动使用_iPhone或_iPad应用程序委托子类。
如果重写应用中:didFinishLaunchingWithOptions:在每个子类中的方法,你会看到这样的工作:
// In YourAppNameAppDelegate_iPhone.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"iPhone App Delegate");
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
// In YourAppNameAppDelegate_iPad.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"iPad App Delegate");
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
这给你一个起点,在那里你可以根据设备的用户是对改变程序流程。例如通过实例化主视图控制器的其中一个子类(如下所述)。
当您将新的视图控制器添加到您的项目中时,您应该通过创建一个通用控制器超类以及iPhone/iPad特定的子类继续此范例。请注意,通用超类不应该有与它们相关联的nib文件,而子类应该各自拥有自己的独立笔尖。
这样你就可以在三个类之间分解代码,在超类中保留与平台无关的东西 - 例如一些属性,方法,IBOutlets和IBActions - 并将特定于平台的实现放入子类中。
看起来很酷,但当iPad 3或4具有视网膜显示,然后你被@ HD @ 2x卡住时会发生什么。这会是一团糟。 – Moshe 2011-04-11 00:28:35