导航控制器 pushViewController 不工作
navigation controller pushViewController not working
我正在创建一个目前有 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
但还是没用:(
你打错了:
是
_window.rootViewController = _navigationController;
没有
_window.rootViewController = _joinViewController;
NeverHopeless 的建议也很到位。这可能是错字以及您将第二个 viewcontroller
添加为 ViewController2
而未使用正确的变量名称的事实。
另一个建议是制作故事板(如果您没有使用故事板)并为过渡添加 segue。只需将 segue 处理分配给按钮即可。像这样:
-(IBAction)SessionNicknameSubmit:(id)sender
{
[self performSegueWithIdentifier:@"identifier" sender:self ];
}
Here 很好地描述了它的工作原理和使用方法以及一些有用的指示!
Obj-C 是一种区分大小写的语言,class 名称和实例名称不应像 ViewController2
一样。像这样尝试:
- (IBAction)SessionNickNameSubmit:(id)sender {
ViewController2 *viewController2 = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil];
[self.navigationController pushViewController:viewController2 animated:YES];
}
原因是您将 window 的 rootViewController 设置为 ViewController1。
您需要将导航控制器设置为 window 的 rootViewController。
因此,当您尝试通过按下按钮访问 self.navigationController 时,它将访问 self 所在的导航控制器,即现在您的 window 的 rootViewController。
然后它将正确推送下一个视图控制器。
在查看了几乎每个教程和每个堆栈溢出答案之后,我终于找到了一个有效的解决方案。我必须在应用程序委托中创建故事板的实例,并使用它来创建我的第一个视图控制器实例。
- (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
绑定到它(独立于显示的视图控制器在模拟器中)。因此,当我使用 push 方法时,它无法识别 self.NavigationController
(这就是 NSLog(self.NavigationController == nil)
记录 1
的原因
我正在创建一个目前有 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
但还是没用:(
你打错了:
是
_window.rootViewController = _navigationController;
没有
_window.rootViewController = _joinViewController;
NeverHopeless 的建议也很到位。这可能是错字以及您将第二个 viewcontroller
添加为 ViewController2
而未使用正确的变量名称的事实。
另一个建议是制作故事板(如果您没有使用故事板)并为过渡添加 segue。只需将 segue 处理分配给按钮即可。像这样:
-(IBAction)SessionNicknameSubmit:(id)sender
{
[self performSegueWithIdentifier:@"identifier" sender:self ];
}
Here 很好地描述了它的工作原理和使用方法以及一些有用的指示!
Obj-C 是一种区分大小写的语言,class 名称和实例名称不应像 ViewController2
一样。像这样尝试:
- (IBAction)SessionNickNameSubmit:(id)sender {
ViewController2 *viewController2 = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil];
[self.navigationController pushViewController:viewController2 animated:YES];
}
原因是您将 window 的 rootViewController 设置为 ViewController1。
您需要将导航控制器设置为 window 的 rootViewController。
因此,当您尝试通过按下按钮访问 self.navigationController 时,它将访问 self 所在的导航控制器,即现在您的 window 的 rootViewController。
然后它将正确推送下一个视图控制器。
在查看了几乎每个教程和每个堆栈溢出答案之后,我终于找到了一个有效的解决方案。我必须在应用程序委托中创建故事板的实例,并使用它来创建我的第一个视图控制器实例。
- (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
绑定到它(独立于显示的视图控制器在模拟器中)。因此,当我使用 push 方法时,它无法识别 self.NavigationController
(这就是 NSLog(self.NavigationController == nil)
记录 1