Apple 现在为您提供了一种默认机制,可在同一项目中将您的代码在 iPhone 和 iPad 之间分离。
在 Xcode 4 中,当您创建新的“基于窗口的应用程序”或“基于视图的应用程序”时,您可以选择“设备系列”。如果您为此选项选择“通用”,Xcode 将创建 3 个应用代理。
首先,一个主应用委托:
YourAppNameAppDelegate : NSObject <UIApplicationDelegate>
以及作为“YourAppNameAppDelegate”子类的另外两个应用代理(放置在不同的组中):
YourAppNameAppDelegate_iPhone : YourAppNameAppDelegate
YourAppNameAppDelegate_iPad : YourAppNameAppDelegate
当您使用 iPhone 或 iPad 模拟器(或设备)运行应用程序时,应用程序将根据所选设备自动使用 _iPhone 或 _iPad 应用程序委托子类。
如果你在每个子类中重写 application: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 文件,而子类应该有各自独立的 nib。
这样您就可以在三个类之间拆分代码,在超类中保留与平台无关的东西 - 例如一些属性、方法、IBOutlets 和 IBActions - 并将特定于平台的实现放入任一子类中。