UIViewController.navigationController становится нулевым - PullRequest
2 голосов
/ 13 января 2012

Я столкнулся с проблемой, когда UIViewController.navigationController становится nil, и я отчаянно пытаюсь найти ответ на этот вопрос.

UINavigationController получает настройку в делегате приложения:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    self.rootViewController = [[RootViewController alloc] initWithNibName:@"RootView" bundle:nil];

    UINavigationController* navigationController = [[UINavigationController alloc] initWithRootViewController:self.rootViewController];
    [self.window addSubview:navigationController.view];

    [self.window makeKeyAndVisible];

    return YES;
}

Когда появляется RootViewController, устанавливается элемент self.navigationController, и я могу использовать его, чтобы скрыть панель навигации, например:

- (void)viewWillAppear:(BOOL)animated {
    NSLog( @"self = %@, self.navigationController = %@", self, self.navigationController );
    [self.navigationController setNavigationBarHidden:YES animated:NO];
}

Выходные данные отладки показывают значения дляself и self.navigationController.

При нажатии кнопки в этом контроллере, self остается тем же значением, но self.navigationController теперь nil:

- (IBAction)buttonClicked:(id)sender {
        NSLog( @"self = %@, self.navigationController = %@", self, self.navigationController );
        // here, self.navigationController is nil, so
        // [self.navigationController pushViewController:...] doesn't work :-(
}

Я видел десятки вопросов, касающихся этой проблемы, и всегда был ответ, что UIViewController не является частью UINavigationController.Поскольку доступ к navigationController в viewWillAppear работает нормально, я считаю, что должно происходить что-то еще.У вас есть какие-либо указатели?Я с радостью предоставлю более подробную информацию, если это необходимо.

Ответы [ 4 ]

2 голосов
/ 10 октября 2012

Попробуйте это в делегате приложения:

[(UINavigationController *)self.window.rootViewController pushViewController:yourViewController animated:NO];

rootviewcontroller на самом деле UINavigationController, если вы хотите отладить его.Это работает для меня.

1 голос
/ 06 июня 2012

Ваш код показывает, что вы используете только вид навигационного контроллера, но просто молитесь, чтобы жизнь навигационного контроллера управлялась некой волшебной рукой, а это не так.

Вам нужен кто-то, чтобы явным владельцем навигационного контроллера здесь.

Фактически, следующая строка:

[self.window addSubview:navigationController.view];

, кажется, указывает, что вы хотите, чтобы rootViewController окна был навигационным контроллером:

self.window.rootViewController = navigationController;

Но такжеПохоже, что делегат приложения также должен быть владельцем навигационного контроллера, так что навигационный контроллер должен фактически быть иваром делегата вашего приложения.

Короче говоря, исправьте ваш объектный граф (и он по совпадению сделаетдополнительные удержания вы сделали вручную и исправили ошибку)

0 голосов
/ 13 января 2012

Как всегда, это помогает сформулировать вопрос, просто чтобы найти решение через несколько минут.

Я стал жертвой ARC, я полагаюКак только я сохранил UINavigationController в делегате приложения, он работал нормально.

0 голосов
/ 13 января 2012

У меня была проблема с контроллером nil view, и я обнаружил, что он неправильно подключен в раскадровке к делегату приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...