我正在创建一个目前有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
我使用mainViewCtrl
和secondViewCtrl
但仍然没用:(
答案 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