UIWindow теряет rootviewcontroller после запуска

В моем приложении есть UIWindow с правильно настроенным контроллером rootview. Я знаю это, потому что я проверяю rootViewController после его установки (в делегате приложения), и все в порядке.

Как только мое приложение запускается, все работает нормально. Моя проблема в том, что контроллер rootview больше не устанавливается правильно в UIWindow, когда я проверяю «основной» вид.

Мое приложение работает нормально... так в чем проблема, которая может вас заинтересовать... ну, я пытаюсь внедрить AdColony (видеореклама), и им нужно захватить rotviewcontroller UIWindow, чтобы отобразить их рекламу. Когда они проверяют rootviewcontroller... он равен нулю.

Я также добавил код для проверки... и rootviewcontroller имеет значение null.

Как мой UIWindow может потерять указатель на rootviewcontroller? Мне нужна помощь в понимании того, как работает архитектура UIWindow.

Спасибо

код, который проверяет видимый контроллер UIWindow (приведенный ниже код возвращает nil для значения viewcontrollers.

    UIWindow* window = [UIApplication sharedApplication].keyWindow;
    UIViewController* rootViewController = [window rootViewController];

    [self getVisibleViewControllerChild:rootViewController];


- (UIViewController*)getVisibleViewControllerChild:(UIViewController*)viewController {

UIViewController* visibleViewController = nil;

if(!viewController) {
    NSLog(@"nil");
    return nil;
}

if ([viewController isKindOfClass:[UINavigationController class]]) {
    UINavigationController* navigationController = (UINavigationController*)viewController;
    viewController = navigationController.visibleViewController;
    NSLog(@"viewcontroller is nav controller");
}

while (visibleViewController == nil) {

    if (viewController.modalViewController == nil) {
        visibleViewController = viewController;
        NSLog(@"visibleViewController = %@", visibleViewController);
    } else {

        if ([viewController.modalViewController isKindOfClass:[UINavigationController class]]) {
            UINavigationController *navigationController = (UINavigationController *)viewController.modalViewController;
            viewController = navigationController.visibleViewController;
            NSLog(@"modal 1");
        } else {
            viewController = viewController.modalViewController;
            NSLog(@"modal 2");
        }
    }

}

return visibleViewController;

}


person edhnb    schedule 27.03.2013    source источник


Ответы (1)


Я не могу понять, что вы пытаетесь сделать с этим кодом, но метод keyWindow, кажется, возвращает nil, поэтому rootViewController также будет nil. Я не уверен, почему это так, но вы можете получить rootViewController с помощью (я предполагаю, что вы делаете это из контроллера представления):

self.view.window.rootViewController
person rdelmar    schedule 27.03.2013
comment
Хорошо, ты меня идешь в правильном направлении. Прошу прощения за неконкретный вопрос.. Я немного смущен тем, что происходит. Кажется, моя проблема заключается в том, что мой visibleViewController каким-то образом обнуляется. Для rootViewController правильно задан мой UINavigationController. Что очень странно, так это то, что если я представляю модальный контроллер (например, собственное представление композиции твита), то он отклоняется, так как visibleViewController установлен правильно. Как только вид обновляется... он снова равен нулю. - person edhnb; 27.03.2013
comment
@mtb, в своем вопросе вы говорите, что AdColony нужно захватить контроллер корневого представления, поэтому я не понимаю, что вы пытаетесь сделать с visibleViewController. Также вы вызываете getVisibleViewControllerChild:, который возвращает UIViewController, но вы никогда не присваиваете возвращаемое значение какой-либо переменной или свойству. - person rdelmar; 27.03.2013
comment
Этот код предназначен только для проверки существования visibleViewController. Когда мое приложение запускается, корневой контроллер правильно устанавливается на контроллер навигации. Но visibleViewController равен нулю. Я правильно установил его в делегате приложения, и приложение работает нормально... но поскольку visibleViewcontroler равен нулю, AdColony (и каналы Facebook) работают неправильно. Очень странно то, что после того, как я использую модальное представление композиции собственного твита... visibleViewController заполняется правильно. Я каким-то образом искажаю visibleViewController, когда захожу в приложение... Я просто понятия не имею, как...? - person edhnb; 27.03.2013
comment
хорошо, поэтому я решил использовать [self.view.window makeKeyWindow]; когда мне нужно было убедиться, что главное окно установлено правильно. Насколько это большой взлом? - person edhnb; 28.03.2013
comment
@mtb, меня все устраивает, но способ, которым я опубликовал, не помог вам получить контроллер корневого представления? - person rdelmar; 28.03.2013