Как установить разные AppDelegate для разных целей в рамках одного проекта?

Я очень очень плохо знаком с концепцией цели в XCode. Я следовал этому руководству, чтобы научиться создавать две цели в одном проекте. Я просто хочу знать, как использовать цель А AppDelegateA.swift в качестве назначенного делегата приложения и цели B AppDelegateB.swift как его назначенный делегат приложения. Потому что в этом учебнике он фактически учит, как создавать два приложения из одного и того же AppDelegate. Но я делаю два (почти) совершенно разных приложения, которые используют много ресурсов и библиотек.

И пока мы обсуждаем эту тему, могу ли я иметь цель А использовать раскадровку под названием Mainи цель B также использует раскадровку под названием Main, но на самом деле это разные раскадровки (но собранные внутри одного проекта)?

2 ответа

Решение

Да, вы можете создать 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);
    }
}

Но ИМО тебе не стоит этого делать.

Вместо этого делайте так, как это делает Apple, в приложении делегат загружают разные контроллеры представления или разные 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

Новый ответ на старый вопрос, который задавал мне сам. В наши дни ответ довольно прост:

  1. Дублируйте main.m для каждой цели
  2. Задайте целевое членство для каждого main.m на боковой панели справа.
  3. Создайте класс AppDelegate для каждой цели. Они могут иметь одинаковые или разные имена и соответствующим образом устанавливать целевое членство для каждого AppDelegate.
  4. В каждом из mains.m вызовите класс AppDelegate, который ему нужно использовать. Он может даже иметь разные названия.

Надеюсь, что мой ответ здесь поможет во второй части включения нескольких файлов AppDelegate на основе целей. /questions/36045352/swift-3-kak-upravlyat-raznyimi-delegatami-dlya-raznyih-tselej/36045371#36045371

Для первой части использования нескольких целей вы можете сделать это, просто дублируя базовую цель, вы получите скопированный список plist, измените имя на основе новой цели или сохраните его с тем же именем plist.info, но по другому пути. для разделения файлов кода (таких как Appdelegates), раскадровок и ресурсов или конфигурационных файлов firebase plist вы можете найти мой ответ в приведенном выше, как действительный для этих целей.

Надеюсь это поможет.

Другие вопросы по тегам