推送导航控制器堆栈后视图不显示
Posted
技术标签:
【中文标题】推送导航控制器堆栈后视图不显示【英文标题】:View is not displaying after pushing on navigationController stack 【发布时间】:2012-05-22 04:50:30 【问题描述】:我正在尝试使用导航控制器来推送/弹出视图,但我不希望顶部带有按钮的栏;我自己在做导航 UI。
所以我在 AppDelegate 中创建了一个 navigationController:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.viewController = [[WSViewController alloc] initWithNibName:@"WSViewController" bundle:nil];
self.window.rootViewController = self.viewController;
self.navController = [[UINavigationController alloc]
initWithRootViewController: self.viewController];
[self.window makeKeyAndVisible];
return YES;
然后在我的 WSViewController 中,我有一个 IBAction 方法,该方法将另一个视图推送到导航堆栈上(我已经验证它正确地执行此操作;我在堆栈上看到它):
- (IBAction)showInfo:(UIButton *)sender
if (self.wsInfoViewController == nil)
WSInfoViewController *wic = [[WSInfoViewController alloc] initWithNibName:@"WSInfoViewController" bundle:nil];
self.wsInfoViewController = wic;
[self.navigationController pushViewController:self.wsInfoViewController animated:YES];
但是当我点击我的 WSViewController 中的信息按钮时,我没有看到信息视图出现(它显示得很好)。
如果我将 navigationController 设为根控制器,那么当我点击 info 按钮时,我确实会看到 wsInfoViewController,但是,我也会在顶部看到导航栏,但我没有想要!
所以...首先,我认为我可以以这种方式使用导航控制器是错误的(即,将其用于堆栈目的,但根本不能用于任何 UI)?
其次,如果我没记错的话,为什么我推入堆栈的视图没有显示出来?我猜这是因为我没有正确地将导航控制器连接到窗口,但我不知道该怎么做。
谢谢!!!
伊丽莎白
【问题讨论】:
你把 IBOutlet 和你的 viewController 连接起来了吗? 你的意思是当我点击按钮时我的 showInfo 方法会被调用吗?是的,我在将视图推送到堆栈之后放置了一个断点,并且视图肯定在堆栈上。我认为问题在于窗口不知道 navigationController 堆栈,但我不知道如何正确设置。 没有。我的意思是您是否将 IBOutlet WSInfoViewController 与 FileOwner 中的 viewController 连接起来? 我不知道为什么我需要一个 IBOutlet。我自己在 showInfo: 方法中创建 WSInfoViewController,并将引用存储在我的 WSViewController 中的属性中。这不是基本一样吗? 【参考方案1】:所以我想我已经回答了我的问题。也就是说,您必须将导航控制器设置为 AppDelegate 窗口的根视图控制器才能使用它,否则窗口不知道它。我的 WSViewController 仍然是导航控制器的根视图控制器。然后要摆脱导航栏,您可以将其隐藏。 这是更新的代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.viewController = [[WSViewController alloc] initWithNibName:@"WSViewController" bundle:nil];
// doesn't work!
//self.window.rootViewController = self.viewController;
self.navController = [[UINavigationController alloc]
initWithRootViewController: self.viewController];
// do this instead
self.window.rootViewController = self.navController;
[self.window makeKeyAndVisible];
return YES;
要在视图中隐藏导航栏,在您希望隐藏的每个视图中,添加以下方法:
- (void) viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:animated];
- (void) viewWillDisappear:(BOOL)animated
[super viewWillDisappear:animated];
[self.navigationController setNavigationBarHidden:NO animated:animated];
到目前为止效果很好!
【讨论】:
以上是关于推送导航控制器堆栈后视图不显示的主要内容,如果未能解决你的问题,请参考以下文章
Swift iOS - 如何打印导航堆栈中尚未推送的所有子视图控制器的列表