self.NavigationController имеет значение null

#iphone #navigationcontroller

#iPhone #navigationcontroller

Вопрос:

в моем viewcontroller у меня есть кнопка, при нажатии на которую вводится NavigationController, мой код, например:

 -(IBAction)ShangHaiButtonPressed:(id)sender{
    marketviewcontroller = [[MarketViewController alloc]initWithNibName:@"MarketViewController" bundle:nil];
    NSLog(@"%@",self.navigationController);
    [self.navigationController pushViewController:marketviewcontroller animated:YES];
    [marketviewcontroller release];   
}
  

но я вижу, что self.NavigationController равен нулю, как решить эту проблему? спасибо.

Обновить:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    _switchviewcontroller = [[SwitchViewController alloc]initWithNibName:@"SwitchViewController" bundle:nil];
    [self.window addSubview:_switchviewcontroller.view];
    [self.window makeKeyAndVisible];
    return YES;
}
  

Комментарии:

1. Я предполагаю, что ваш currentViewController отсутствует в иерархии стека навигационного контроллера. добавление currentViewController в navigationcontroller должно решить проблему yr

2. В делегате приложения есть объект window , в методе AppDidFinishLaunching сначала создайте объект для yr firstcontroller, затем создайте объект NavigationController, подобный — [[UINavigationController alloc]initWithRootViewController:yrcurrentcontroller]; [self.window addSubview:NavigationController.view]

Ответ №1:

Свойство NavigationController контроллера представления вернет действительный объект контроллера навигации, только если контроллер представления находится в стеке навигации контроллера навигации. Контроллер представления можно добавить в стек навигации следующими способами.

  1. Путем превращения контроллера представления в RootViewController навигационного контроллера с использованием initWithRootViewController: метод UINavigationController

  2. Нажав на контроллер представления с помощью pushViewController: метод UINavigationController.

Убедитесь, что ваш контроллер представления добавлен в стек навигации любым из вышеперечисленных способов.


РЕДАКТИРОВАТЬ: (После того, как в вопрос добавлен код didFinishLaunchingWithOptions:):

Измените метод didFinishLaunchingWithOptions: на этот,

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    _switchviewcontroller = [[SwitchViewController alloc]initWithNibName:@"SwitchViewController" bundle:nil];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:_switchviewcontroller];
    [self.window addSubview:navController.view];
    [navController release];
    [self.window makeKeyAndVisible];
    return YES;
}
  

Swift 4 (версия):

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
    switchviewcontroller = SwitchViewController(nibName: "SwitchViewController", bundle: nil)
    let navController = UINavigationController(rootViewController: switchviewcontroller)
    window.addSubview(navController.view)
    window.makeKeyAndVisible()
    return true
}
  

Комментарии:

1. У меня просто есть приведенный выше код о работе с NavigationController, так что какой еще код мне нужно написать, спасибо.

2. У вас есть window -> currentViewController , и теперь вы хотите нажать marketviewcontroller , (т.Е.) window -> currentViewController -> marketviewcontroller, верно?

3. Хорошо. Отредактируйте свой вопрос и вставьте didFinishLaunchingWithOptions: туда код делегата приложения.

4. большое вам спасибо, и я попробую. если это сработает, я приму ваш ответ, еще раз спасибо.

5. Ты спас мой день. Проверил, чтобы узнать, что я нажимаю с помощью presentViewController: анимированный

Ответ №2:

Этот код даст решение, которое вы ищете:

 -(IBAction)ShangHaiButtonPressed:(id)sender {
     UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self];
     [self.view removeFromSuperview];
     [appDelegate.window addSubview:nav.view];   // appDelegate is the delegate of your Application
     marketViewController = [[MarketViewController alloc] initWithNibName:@"MarketViewController" bundle:nil];
     [nav pushViewController:marketViewController animated:YES];
     [marketViewController release];    
}
  

Ответ №3:

В файле AppDelegate.m создайте свой первый вид rootView для навигации :

 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    myView *Obj=[[myView alloc]initWithNibName:@"myView" bundle:nil];
    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:Obj];
    nav.navigationBar.barStyle = UIBarStyleBlackOpaque;
    [window addSubview:nav.view];
    [self.window makeKeyAndVisible];
    return YES;
}
  

В вашем файле MyView.m добавьте приведенный ниже код для перехода к myNewView из MyView :

 -(void) registerMethod {
    myNewView *obj = [[myView alloc] initWithNibName:@"myNewView" bundle:nil];
    [self.navigationController pushViewController:obj animated:YES];

    [obj release];
}