导航控制器pushViewController无法正常工作

时间:2015-08-03 12:16:40

标签: ios objective-c uinavigationcontroller

我正在创建一个目前有2个主视图控制器的应用程序。应用程序加载到初始viewController中,单击里面的按钮应该调出第二个viewController。这就是我所拥有的:

AppDelegate.h

#import <UIKit/UIKit.h>
#import "ViewController1.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ViewController1 *mainViewCtr;
@property (strong, nonatomic) UINavigationController *navigationController;
@end

AppDelegate.m

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    _mainViewCtr = [[ViewController1 alloc] initWithNibName:@"mainViewCtr" bundle:nil];
    _navigationController = [[UINavigationController alloc] initWithRootViewController:_mainViewCtr];
    _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    _window.rootViewController = _navigationController;
    _navigationController.delegate = self;
    _navigationController.navigationBarHidden = YES;
    [_window addSubview:_navigationController.view];
    [self.window makeKeyAndVisible];
}

viewcontroller1中的按钮方法:

- (IBAction)SessionNickNameSubmit:(id)sender {
    ViewController2 *secondViewCtrl = [[ViewController2 alloc] initWithNibName:@"secondViewCtrl" bundle:nil];

    [self.navigationController pushViewController:secondViewCtrl animated:YES];
}

但是当我点击按钮时,视图不会改变。我试过调试并且代码被命中,但没有任何反应。

我错过了某处的设置吗?

更新

我已更新所有viewController变量名称:

而不是ViewController1/2我使用mainViewCtrlsecondViewCtrl

但仍然没用:(

4 个答案:

答案 0 :(得分:5)

你写了一个错字:

它是

_window.rootViewController = _navigationController;

_window.rootViewController = _joinViewController;

并且NeverHopeless的建议也是正确的。这可能是错字以及您将第二个viewcontroller添加为ViewController2并且未使用正确的变量名称这一事实。

另一个建议是制作故事板(如果你没有使用故事板)并为过渡添加一个segue。只需将segue处理分配给按钮即可。像这样:

-(IBAction)SessionNicknameSubmit:(id)sender
{
    [self performSegueWithIdentifier:@"identifier" sender:self ];
}

Here很好地描述了它的工作原理以及如何使用它以及一些有用的指针!

答案 1 :(得分:1)

Obj-C是区分大小写的语言,类名和实例名称不应与ViewController2相同。试试这样:

- (IBAction)SessionNickNameSubmit:(id)sender {
    ViewController2 *viewController2 = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil];

    [self.navigationController pushViewController:viewController2 animated:YES];
}

答案 2 :(得分:0)

原因是您已将窗口的rootViewController设置为ViewController1。

您需要将导航控制器设置为窗口的rootViewController。

因此,当您尝试按下按钮时访问self.navigationController时,它将访问自身所在的导航控制器,即您的窗口的rootViewController。

然后它将正确推送下一个视图控制器。

答案 3 :(得分:0)

在查看几乎所有教程和每个堆栈溢出答案之后,我终于找到了一个有效的解决方案。我必须在app delegate中创建一个storyboard实例,并使用它来创建我的第一个视图控制器实例。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    self.joinViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController1"];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:joinViewController];
    _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    navigationController.navigationBarHidden = YES;
    _window.rootViewController = navigationController;
    [_window addSubview:navigationController.view];
    [self.window makeKeyAndVisible];

    return YES;
}

我认为问题在于,当我创建ViewController的实例时,它正在创建一个新实例并将navigation controller绑定到它(独立于显示在其中的视图控制器)模拟器)。因此,当我使用推送方法时,它无法识别self.NavigationController(这就是为什么NSLog(self.NavigationController == nil)正在记录1