2014-11-05 1 views
2

Я использую тайфун с «Plist интеграции»Typhoon с одноплодной AppDelegate

Я определил AppDelegate следующим образом внутри сборки:

- (AppDelegate *)appDelegate { 
    return [TyphoonDefinition withClass:[AppDelegate class] configuration:^(TyphoonDefinition *definition) { 
     [definition injectProperty:@selector(window)]; 
     definition.scope = TyphoonScopeSingleton; 
    }]; 
} 

Внутри window, у меня есть rootViewController с delegate что он реализован AppDelegate.

- (RootViewController *)rootViewController { 
    return [TyphoonDefinition withClass:[RootViewController class] configuration:^(TyphoonDefinition *definition) { 
     [definition injectProperty:@selector(delegate)]; 
    }]; 
} 

Проблема заключается в том, что delegate устанавливается с другим экземпляром AppDeleaate. Я установил точку останова внутри AppDelegateinit, и действительно, это называется дважды.

Я знаю, что решение было бы вручную установить delegate внутри AppDelegate во время выполнения, но я бы хотел, чтобы это обрабатывалось тайфун.

Примечание: Я не пробовал, но это может произойти с контроллерами представлений, созданными раскадными версиями.

ответ

3

Хороший вопрос.

Тайфун не вводил ваш первоначальный AppDelegate, поскольку он был создан за пределами Тайфуна. Тайфун имеет inetrnal пул объектов, и они используются для ввода в другие объекты, если Typhoon не имеет объекта в пуле, он будет создан с использованием указанного инициализатора (и сохраняется, если область действия является одиночной).

ViewControllers, созданные из раскадровки, будут введены правильно, так как они созданы внутри Typhoon.

Для решения вашей конкретной проблемы попробуйте это определение для AppDelegate:

- (AppDelegate *)appDelegate { 
    return [TyphoonDefinition withClass:[AppDelegate class] configuration:^(TyphoonDefinition *definition) { 
     [definition setFactory:[self sharedApplication]]; 
     [definition useInitializer:@selector(delegate)]; 
     [definition injectProperty:@selector(window)]; 
     definition.scope = TyphoonScopeSingleton; 
    }]; 
} 

- (UIApplication *)sharedApplication { 
    return [TyphoonDefinition withClass:[UIApplication class] configuration:^(TyphoonDefinition *definition) { 
     [definition useInitializer:@selector(sharedApplication)]; 
    }]; 
} 

Тогда при решении appDelegate определения, Typhoon будет вызывать [[UIApplication sharedApplication] delegate] метод и зарегистрировать возвращенный экземпляр в Typhoon.

С таким образом, AppDelegate будет создан только один раз (по UIApplication) .. Но инъекции будут применяться два раза (один запуск duting, второй один при решении определения AppDelegate первый раз)

Update

AppDelegate чехол фиксированный внутри Typhoon. Теперь ваш оригинальный код будет работать (с версией head или в будущей версии).

0

Это, похоже, сломалось снова в 8.4.

Выполняя интеграцию plc Typhoon, вы получаете 2 AppDelegates. Один создается UIApplication и тот, который управляется Typhoon.

Я перешел от того, как текущие документы Typhoon говорят создать AppDelegate:

public dynamic func appDelegate() -> AnyObject { 
return TyphoonDefinition.withClass(AppDelegate.self) { 
    (definition) in 

    // load up any environment variables/injections 
    definition.injectProperty("assembly", with: self) 
    definition.injectProperty("window", with: UIWindow(frame: UIScreen.mainScreen().bounds)) 
    definition.scope = TyphoonScope.LazySingleton 
} 

Чтобы сделать это IAW с ответом Alekseys «s.

Это исправление проблемы с 2x AppDelegate, но это оставляет проблему с курицей и яйцом; в частности, что AppDelegate создается с помощью UIApplication до сборка тайфуна создается через plist. Таким образом, если ваши контроллеры просмотра управляются Typhoon, а не с помощью раскадровки, они не будут существовать во время фазы настройки приложения didFinishLaunchingWithOptions приложения appDelegate.

Чтобы исправить это, я превратил сборку тайфуна в обычный синглтон и удалив интеграцию plist.

Надеюсь, это поможет людям, борющимся с одной и той же проблемой.

 Смежные вопросы

  • Нет связанных вопросов^_^