【问题标题】:What can I do if my navigationController returns "(null)"? [duplicate]如果我的 navigationController 返回“(null)”,我该怎么办? [复制]
【发布时间】:2011-11-02 20:49:41
【问题描述】:

可能重复:
Why can't I push a new view controller onto the current view?
Why is my new view controller not appearing?

我需要从我的 navigationController 推送我的视图控制器,但是在执行 NSLog 语句以找出为什么以下代码没有显示任何内容之后,我意识到它返回 null:

-(IBAction)doChangePasscode{

NSLog(@"Change Passcode Screen Loaded!"); 

ChangePasscode *cpscreen = [[ChangePasscode alloc] initWithNibName:@"ChangePasscode" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:cpscreen animated:YES];

NSLog(@"%@",self.navigationController); 

}

为什么会这样?我可以做些什么来返回一个正确的值而不是(null)?

【问题讨论】:

  • 你有这段代码的原始控制器是什么?它实际上是一个 NavigationController 吗?
  • 不确定,就是叫“ViewController.m”...
  • 你能在上面的代码中显示你正在初始化和显示self视图控制器的代码吗?
  • 听起来您的导航控制器没有正确连接到您的视图。你能发布一些代码吗?我们很难猜到这一点。
  • 此问题与stackoverflow.com/questions/7986700/…stackoverflow.com/questions/7986045/… 重复 请停止发布新问题并跟进旧问题!

标签: iphone objective-c ios xcode uinavigationcontroller


【解决方案1】:

就像每个人在本文中和 Why is my new view controller not appearing? 中解释的那样,您首先需要有一个导航控制器。使用该导航控制器推送您的视图控制器,然后您的视图控制器将不再具有 navigationController 属性的 null。

在此示例中,someSecondViewController 将是上面代码中的 self

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    RootViewController *rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
    self.nav = [[[UINavigationController alloc] initWithRootViewController:rootViewController] autorelease];
    [rootViewController release];
    [self.window addSubview:nav.view];
    [self.window makeKeyAndVisible];
}

- (void)someOtherMethod {
    SecondViewController *someSecondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    [self.nav pushViewController:someSecondViewController animated:YES];
    [someSecondViewController release];
}

请查看这些:

View Controller Programming Guide for iOS
UINavigationController Docs
UIViewController Docs

【讨论】:

    【解决方案2】:

    我假设你的意思是返回 nil,这意味着 viewController 没有导航控制器,你可以通过让 viewController 成为新创建的 UINavigationController 的根来解决它,如下所示:

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myRootViewController];
    

    那么对于myRootViewController self.navigationController 会返回导航控制器。

    我假设 viewController 是您应用中的第一个,所以您希望在您的 appDelegate 上使用它:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        MyViewController *viewController = [[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil] autorelease];
        UINavigationController *myNavController = [[[UINavigationController alloc] initWithRootViewController:viewController] autorelease];
    
        self.window.rootViewController = myNavController;
        [self.window makeKeyAndVisible];
    
        return YES;
    }
    

    如果 IBAction 在 MyViewController 上,self.navigationController 将返回导航控制器而不是 nil。

    希望对您有所帮助。

    【讨论】:

    • 我在你说“myRootViewController”的地方放什么?
    • 您希望成为导航控制器堆栈上的第一个 viewController 的 viewController 实例。
    • 我放了“ViewController”,但它出现了一个错误并说它是一个未声明的标识符:(
    猜你喜欢
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2022-07-25
    • 2012-04-14
    • 1970-01-01
    相关资源
    最近更新 更多