【问题标题】:How to set different AppDelegate for different targets within same project?如何为同一项目中的不同目标设置不同的 AppDelegate?
【发布时间】:2016-10-26 04:24:23
【问题描述】:

我对 Xcode 中的目标概念非常陌生。我已经按照这个tutorial 学习在同一个项目中创建两个目标。我只想知道如何让目标 A 使用 AppDelegateA.swift 作为其指定的应用程序代理,目标 B 使用 AppDelegateB.swift 作为其指定的应用程序代理。因为在教程中,它实际上教了如何从同一个 AppDelegate 制作两个应用程序。但我制作了两个(几乎)完全不同的应用程序,它们共享大量资源和库。

当我们讨论这个主题时,我是否也可以让目标 A 使用名为 Main 的故事板,而目标 B 也使用名为 Main 的故事板,但它们实际上是不同的故事板(但放在一起同一个项目)?

【问题讨论】:

  • 我很好奇,你为什么要这个?
  • @AlexanderMomchliov 因为我想让代码尽可能分开,如果它们是分开的(在我的逻辑中)。在我看来,AppDelegate 是应用程序的“入口点”,因此也应该将实际上是一个非常不同的应用程序(但共享大量库和资源)的目标分开。这样我就可以将每个目标组织在他们自己的文件夹中,包括 AppDelegate,并且可以将它们快速复制到不同的项目中。
  • 如果您有两个非常不同的应用程序,那么它们应该是两个不同的项目。他们的共享代码应该被提取到第三个库项目中,从前两个中引用。
  • @AlexanderMomchliov 我认为您指的是依赖关系。我已经阅读了关于依赖项目的简介,我认为它本身就是一个完全不同的野兽,我需要在不同的时间慢慢消化。现在我只是试图探索我可以从目标获得哪些选项,什么是可能的,什么不是。但是我非常感谢您的建议,并且在我对当前主题有了更多了解之后,当我了解目标依赖关系时,我会牢记这一点。非常感谢。 :)
  • 您可以在 Xcode 中为每个单独的目标设置嵌入文件,您不需要硬编码任何东西,您只需将正确的AppDelegate.swift 文件附加到 下的所需目标File Inspector / Target Membership 面板;我不会采用答案中的解决方案,那是一种可怕的解决方案,可能是许多错误或问题的根源。

标签: ios target appdelegate


【解决方案1】:

是的,您可以根据目标创建 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);
    }
}

但是 IMO 你不应该这样做。

而不是像苹果那样做,在应用程序委托中加载不同的视图控制器或不同的 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

【讨论】:

  • 那是(ARC 之前的)Objective-C,而不是 Swift。
  • 哦,我明白了,所以我们没有使用两个 AppDelegate,而是使用相同的 AppDelegate,但完全加载不同的屏幕。感谢您提供两种方式!
  • @MartinR 没关系,就我而言,我只需要知道这个概念。我正在用 swift 编写,但我知道一点 obj c 可以将其转换为 swift。但是,好吧,可能还有其他人需要直接 swift 版本。 :)
  • 我知道这是一个旧答案,可能现在几天都不会适用,但如果您在应用委托中声明了位置功能和健康工具包功能,那么应用商店不会拒绝您的应用,但是以这种方式标记的功能?我的理解是,如果他们看到任何未使用或在您的 .plist 中的代码引用,您将被拒绝。
  • 没有苹果不会拒绝
【解决方案2】:

希望我的回答有助于第二部分包含基于目标的多个 AppDelegate 文件。 https://stackoverflow.com/a/43227300/2715840

对于使用多个目标的第一部分,您可以通过简单地复制基本目标来做到这一点,您将得到您的 plist 已经复制,根据新目标更改名称或保持相同名称 plist.info 但在不同的路径中。对于分离代码文件(如 Appdelegates)、storyboards 和 Assets 或 firebase plist 配置文件,您可以在上面找到我的答案,就像对这些目的有效。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    对我自己提出的一个老问题的新答案。现在的答案很简单:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多