iOS 导航栏按钮在返回 segue 后仍然处于淡化状态

44

我的应用程序中有多个视图控制器,大多数都有一个右侧的UIBarButtonItem,附有直接的“show”segue操作。

切换到另一个视图,然后按下“< 返回”按钮后,原始按钮项仍保持淡出状态,但仍可使用。

这只在iOS 11.2下出现。

我找不到任何可能导致此问题的设置,在其中至少有一种情况下,没有特定的segue unwinding或viewDidAppear处理。我会发一些代码,但 AFAICS 它们都是默认的UINavigationBar行为。


1
希望你已经在这个糟糕透顶的bug上提交了一个问题报告。 - picciano
2
看起来这个问题已在iOS 11.3中得到解决。 - Andrew Bennet
4个回答

37

这是iOS 11.2中的一个错误,因为UIBarButtonItem在导航后保持高亮状态,且在其他视图控制器弹出后未返回到正常状态。

为避免这种行为,请执行以下操作之一:

  1. 使用带有UIButtonUIBarButtonItem作为自定义视图

  2. viewWillDisappear(_:)中禁用并重新启用工具栏按钮项(尽管这会导致按钮立即出现,但使用Matt的解决方案来避免此问题):

    barButtonItem.isEnabled = false
    barButtonItem.isEnabled = true
    

谢谢回复。在viewDidAppear()方法中重置按钮状态是否也可能? - Alnitak
@Alnitak,我在我的答案中添加了第二个选项,以不同的方式解决了这个问题。 - Tamás Sengel
1
感谢 - 两种方式都可以,我不确定哪一种更具视觉吸引力。如果我在 viewWillDisappear(_:) 中执行,则当视图弹出时按钮立即可见。如果我在 viewDidAppear(_:) 中执行,则它会以动画方式重新显示。 - Alnitak
1
请提供任何其他关于此行为的报告链接,这将非常有用。 - Alnitak
1
你也可以在 viewDidDisappear 中翻转启用状态,而不是在 viewWillDisappear 中。没有视觉残留。 - jab
显示剩余2条评论

24

我的做法是在视图控制器的viewWillAppear中解决这个 bug,具体如下:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.tintAdjustmentMode = .normal
    self.navigationController?.navigationBar.tintAdjustmentMode = .automatic
}

这似乎可以在没有视觉瑕疵的情况下唤醒按钮。


用户使用边缘手势向后滑动时,程序无法正常工作。尝试了 viewDidAppear 函数,虽然解决了问题,但当我们使用按钮返回时会有一定的延迟,页面无法立即显示。请问有什么建议可以改善这种情况吗? - mkz
谢谢!这对我很有效。无论是点击返回按钮还是滑动都可以。 - derf26

5

另一个解决方法是在父级navigationController上实现修复 - 这样它的每个子viewController都会得到修复,具体如下

注意:这需要接收类设置为UINavigationController委托

Swift

func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
    if #available(iOS 11.2, *) {
        navigationBar.tintAdjustmentMode = .normal
        navigationBar.tintAdjustmentMode = .automatic
    }
}

Objective-C

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {    
    if (@available(iOS 11.2, *)) {
        self.navigationBar.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;
        self.navigationBar.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic;
    }
}

不确定我是否做错了什么,但是当我使用 popViewController(_) 返回到相关视图时,我无法让这个(或任何其他解决方法)起作用。有人遇到同样的问题吗? - Linus Unnebäck

2
我是这样解决的:

override func viewWillDisappear(_ animated: Bool) {
    navigationController?.navigationBar.tintAdjustmentMode = .normal
    navigationController?.navigationBar.tintAdjustmentMode = .automatic
}

因此,在其他视图出现之前,它将恢复颜色。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接