UINavigationController 上未出现后退按钮 - 无法调试

Posted

技术标签:

【中文标题】UINavigationController 上未出现后退按钮 - 无法调试【英文标题】:Back button not appearing on UINavigationController - can't debug 【发布时间】:2012-12-27 23:40:54 【问题描述】:

导航控制器上的后退按钮有时不会出现。请注意,有时确实如此,因此其他地方的 som 代码中可能还发生了其他事情,但我已尝试以我能想到的各种方式对其进行调试,但似乎没有任何效果。

推送视图控制器的代码如下(很标准):

CommentsTableViewController *vc = [[[CommentsTableViewController alloc] init] autorelease];
vc.puzzleID = self.puzzleModel.puzzleID;
[self.navigationController pushViewController:vc animated:YES];

为了调试这个问题,我在viewWillAppear和viewDidAppear的CommentsTableViewController中放了如下代码(除了我只注册了一次观察者):

self.navigationItem.hidesBackButton = NO;

[self.navigationItem addObserver:self forKeyPath:@"backBarButtonItem" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial) context:nil];

self.navigationItem.backBarButtonItem.title = @"Tactic";
NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setTitle:@"Tactic"];

这些似乎都没有帮助。设置断点后,层次结构中我上方的视图控制器似乎有一个标题(@“Tactic”),并且 hidesBackButton 已经是 NO。 backBarButtonItem 属性为 nil 且始终为 nil,但我认为即使您确实有 backBarButtonItem,这也是预期的行为?

编辑:在父控制器中,我首先将 hidesBackBackButton 设置为 YES,然后(在我按下下一个控制器之前),将其设置回 NO。当我删除这些行时,新的视图控制器有一个后退按钮。为什么一个视图控制器的导航项会影响下一个视图控制器的导航项?

欢迎任何建议或想法。非常感谢。

【问题讨论】:

导航控制器是窗口的根视图控制器吗? @RamyAlZuhouri 是的。是的。 我还读过(来自另一个 *** 问题,所以不确定这是否正确),您应该在推送新的视图控制器之前设置 hidesBackBackButton。但是,我在应用程序的许多其他地方都这样做,并且没有任何问题。如果是这种情况,还有其他方法吗? 【参考方案1】:

也许你可以通过调试更好地解决问题。你假设引导你返回的按钮是这样的:

self.navigationItem.backBarButtonItem.title = @"Tactic";

但那是零,如果你想在导航控制器的导航栏中找到那个按钮:

NSLog(@"%@",self.navigationController.navigationBar.topItem);

我看不出您的代码无法正常工作的原因,您也不需要这样做:

self.navigationItem.hidesBackButton = NO;  

试试这个:

self.navigationController.navigationBar.topItem.hidesBackButton = NO;

无论如何这对我有用,即使我没有将其设置为 NO。

如果这不能解决问题,它至少应该有助于调试它,如果你在 cmets 中仍然有这个问题,并说明 NSLog() 打印了什么。

【讨论】:

是的,你是对的。我不认为 self.navigationItem.backBarButtonItem.title = @"Tactic";有任何区别。我只是将它包括在内以突出我已经尝试过的内容。 我打印出了 self.navigationController.navigationBar.topItem 它和 self.navigationItem 是同一个对象 对于这两个 NSLog 都是 "" 经过进一步调查,我删除后退按钮然后将其放回似乎是一个问题。如果我删除这些行,它工作正常。所以也许用一种新的方式来表达我的问题:如何正确地暂时隐藏 UIViewController 的后退按钮? 好的。划掉最后一条评论。我创建了一个新项目并将 hidesBackButton 设置为 YES 并且 NO 似乎工作正常。不知道为什么它在我当前的项目中不起作用。 顺便说一句。我刚刚对线程进行了另一次传递,这一切都在主线程上。【参考方案2】:

好的。我已经解决了。我不知道为什么这会有所不同,但确实如此。

在我调用 hidesBackButton 的同一个运行循环中,我还调用了:

[self.view addSubview:self.chessBoardViewController.view];

这似乎是以某种方式搞砸了导航栏。如果我删除这条线,它会完美运行。所以我找到的解决方案是将这一行替换为:

[self.view performSelector:@selector(addSubview:) withObject:self.chessBoardViewController.view afterDelay:0];

我不知道为什么会这样,所以如果有人对可能发生的事情有任何见解,请发表评论。

【讨论】:

我应该查看整个代码以了解为什么会这样。如果知道它为什么起作用对您来说非常重要,请发布该项目。

以上是关于UINavigationController 上未出现后退按钮 - 无法调试的主要内容,如果未能解决你的问题,请参考以下文章

GIF 在 JDialog 上未正确显示

在 iPad 上未调用 viewDidAppear 和 viewWillAppear

IIS 上未加载 css 和图像

aarch64 上未对齐 SIMD 加载/存储的性能

iOS10 Facebook 登录弹出到根视图控制器

android上未显示自定义标记图标[关闭]