如何为同一项目中的不同目标设置不同的 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 配置文件,你可以在上面找到我的答案,就像对这些目的有效一样。

希望这对您有所帮助。

我自己提出的一个老问题的新答案。这些天的答案很简单:

  1. 为每个目标复制 main.m
  2. 在右侧面板中为每个 main.m 设置目标成员资格。
  3. 为每个目标创建 AppDelegate class。它们可以具有相同或不同的名称,并适当地为每个 AppDelegate 设置目标成员资格。
  4. 在每个mains.m中调用它需要使用的AppDelegateclass。它甚至可以有不同的名称。