pushViewController 为导航栏设置动画,但未显示新视图 [关闭]

Posted

技术标签:

【中文标题】pushViewController 为导航栏设置动画,但未显示新视图 [关闭]【英文标题】:pushViewController animates the navigation bar but the new view doesn't show up [closed] 【发布时间】:2013-03-14 21:19:14 【问题描述】:

我有一个 ios 应用正在做一些疯狂的事情......我会尽力描述它。

我的导航架构如下:

AppDelegate 调用它:

tabNavController = [[MainTabViewController alloc] initWithNibName:nil bundle:nil];
self.window.rootViewController = tabNavController;
[self.window makeKeyAndVisible];

MainTabViewController 继承自 UITabBarController

在 MainTabViewController 的 viewDidLoad 中,我以编程方式将标签加载到 NSMutableArray 中并将其分配给 tabControllers:

NSMutableArray *tabs;

StreamViewController *controller = [StreamViewController alloc] initWithNib...];
UINavigationController *navCon = [UINavigationController alloc] initWithRootViewController:controller];

[tabs addObject:navContorller];

...
self.viewControllers = tabs;

我的第一个选项卡——默认显示的选项卡——继承自 UIViewController。我在 XIB 中有一个 UITableView 设置作为主视图。我的类是 UITableViewDelegate 和 UITableViewDataSource。

StreamViewController : BaseModuleViewController <UITableViewDelegate, UITableViewDataSource>

表格加载并显示正常。当用户单击一行时,我将一个新的视图控制器推送到堆栈:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath     
   ...
   DetailViewController* detailController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:[NSBundle mainBundle]];
   [self.navigationController pushViewController:detailController animated:YES];
   ...

这就是奇怪的地方。视图控制器的行为就像要显示,但事实并非如此。我看到我的 navigationBar 动画了——我的按钮移动了,标题发生了变化,并且显示了一个后退按钮——但是视图本身没有显示。我什至可以继续单击表格视图单元格并不断加载越来越多的视图,每个新视图都会为导航栏设置动画并显示一个新的后退按钮。然后我可以回击 X 次以“返回”到我的 StreamViewController。

这是下一个踢球者。如果我导航到选项卡 #2,然后返回到选项卡 #1,则上述情况都不会发生,并且视图看起来与它应该的完全一样。

奇怪 - 有人看到这个并且知道发生了什么吗?

编辑

这是一个 YouTube 视频显示它无法正常工作:http://youtu.be/Shces88d6Go

【问题讨论】:

它是如何导航的?您说第一个选项卡中的控制器继承自 UIViewController,导航控制器是从哪里来的?第一个选项卡控制器是否嵌入在导航控制器中? @rdelmar 我的错,我离开了一步。简而言之,每个选项卡项都是 UINavigationControllers。我会编辑和更新 我在您发布的代码中看不到任何会导致此问题的内容。您在子类 MainTabViewController 中对 UITabBarController 进行了哪些更改和/或添加? 我对此有点困惑:“我的第一个选项卡——默认显示的选项卡——继承自 UIViewController。我在 XIB 中有一个 UITableViewController 设置作为主视图。”你的意思是 UITableView(相对于 UITableViewController),还是除了 StreamViewController 之外还有另一个控制器?当我查看您的视频时,我看到一个带有“Stream”的后退按钮,因此它似乎不是第一个控制器。请澄清。 @rdelmar 是的,UITableView。此外,您会看到“流”,因为视频在我单击表格视图单元格时立即开始。通常,您不会看到带有流的后退按钮,但是一旦我单击一次,它就会动画并更改为“流” 【参考方案1】:

尝试添加一个导航控制器作为你的根视图控制器。

tabNavController = [[MainTabViewController alloc] initWithNibName:nil bundle:nil];
    UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:tabNavController];
    self.window.rootViewController = navCtrl;
    [self.window makeKeyAndVisible];

【讨论】:

不幸的是,它做同样的事情。【参考方案2】:

发现我在 MainTabViewController 的 viewDidLoad 方法中启动了一个模态窗口。这以某种方式混淆了系统,是问题的根源。

【讨论】:

以上是关于pushViewController 为导航栏设置动画,但未显示新视图 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

pushViewController 时禁用导航栏透明度

如何覆盖 pushViewController 创建的导航栏的功能

PushViewController 全屏

推送 UIViewController 的自定义导航栏

在 pushViewController (iOS 11) 之后 NavigationBar 高度未更新

使用 pushViewController 然后 popViewController 时将工具栏保持在 UIView 的顶部?