如何为同一项目中的不同目标设置不同的 AppDelegate?
How to set different AppDelegate for different targets within same project?
我对 Xcode 中的目标概念非常陌生。我已经按照这个 tutorial 学习在同一个项目中创建两个目标。我只想知道如何让目标 A 使用 AppDelegateA.swift
作为其指定的应用程序委托,而目标 B 使用 AppDelegateB.swift
作为其指定的应用程序委托。因为在教程中,它实际上是教如何从同一个 AppDelegate 制作两个应用程序。但我制作了两个(几乎)完全不同的应用程序,它们共享大量资源和库。
当我们讨论这个问题时,我可以让目标 A 使用名为 Main
的故事板吗,目标 B 也使用名为 Main
的故事板,但它们实际上是不同的故事板(但放在同一个项目中)?
是的,您可以创建 2 个不同的目标,并进行以下更改:
在项目中
main.m
你可以这样做
int main(int argc, char *argv[])
{
@autoreleasepool {
NSString *appDelegateName;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
appDelegateName = NSStringFromClass([AppDelegateIPhone class]);
} else {
appDelegateName = NSStringFromClass([AppDelegateIPad class]);
}
return UIApplicationMain(argc, argv, nil, appDelegateName);
}
}
但我认为你不应该这样做。
而不是像苹果那样做,在应用程序委托中加载不同的视图控制器或不同的 XIB。
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil] autorelease];
} else {
self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil] autorelease];
}
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
@end
希望我的回答对第二部分基于目标包含多个 AppDelegate 文件有所帮助。
对于使用多个目标的第一部分,您可以通过简单地将基本目标加倍来实现,您将得到已经复制的 plist,根据新目标更改名称或保持相同的名称 plist.info 但在不同的小路。对于分离代码文件(如 Appdelegates)、storyboards 和 Assets 或 firebase plist 配置文件,你可以在上面找到我的答案,就像对这些目的有效一样。
希望这对您有所帮助。
我自己提出的一个老问题的新答案。这些天的答案很简单:
- 为每个目标复制 main.m
- 在右侧面板中为每个 main.m 设置目标成员资格。
- 为每个目标创建 AppDelegate class。它们可以具有相同或不同的名称,并适当地为每个 AppDelegate 设置目标成员资格。
- 在每个mains.m中调用它需要使用的AppDelegateclass。它甚至可以有不同的名称。
我对 Xcode 中的目标概念非常陌生。我已经按照这个 tutorial 学习在同一个项目中创建两个目标。我只想知道如何让目标 A 使用 AppDelegateA.swift
作为其指定的应用程序委托,而目标 B 使用 AppDelegateB.swift
作为其指定的应用程序委托。因为在教程中,它实际上是教如何从同一个 AppDelegate 制作两个应用程序。但我制作了两个(几乎)完全不同的应用程序,它们共享大量资源和库。
当我们讨论这个问题时,我可以让目标 A 使用名为 Main
的故事板吗,目标 B 也使用名为 Main
的故事板,但它们实际上是不同的故事板(但放在同一个项目中)?
是的,您可以创建 2 个不同的目标,并进行以下更改:
在项目中
main.m
你可以这样做
int main(int argc, char *argv[])
{
@autoreleasepool {
NSString *appDelegateName;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
appDelegateName = NSStringFromClass([AppDelegateIPhone class]);
} else {
appDelegateName = NSStringFromClass([AppDelegateIPad class]);
}
return UIApplicationMain(argc, argv, nil, appDelegateName);
}
}
但我认为你不应该这样做。
而不是像苹果那样做,在应用程序委托中加载不同的视图控制器或不同的 XIB。
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil] autorelease];
} else {
self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil] autorelease];
}
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
@end
希望我的回答对第二部分基于目标包含多个 AppDelegate 文件有所帮助。
对于使用多个目标的第一部分,您可以通过简单地将基本目标加倍来实现,您将得到已经复制的 plist,根据新目标更改名称或保持相同的名称 plist.info 但在不同的小路。对于分离代码文件(如 Appdelegates)、storyboards 和 Assets 或 firebase plist 配置文件,你可以在上面找到我的答案,就像对这些目的有效一样。
希望这对您有所帮助。
我自己提出的一个老问题的新答案。这些天的答案很简单:
- 为每个目标复制 main.m
- 在右侧面板中为每个 main.m 设置目标成员资格。
- 为每个目标创建 AppDelegate class。它们可以具有相同或不同的名称,并适当地为每个 AppDelegate 设置目标成员资格。
- 在每个mains.m中调用它需要使用的AppDelegateclass。它甚至可以有不同的名称。