【问题标题】:UIBarButtonItem still selected/highlighted after unwind segueUIBarButtonItem 在展开 segue 后仍然被选中/突出显示
【发布时间】:2025-12-08 02:55:02
【问题描述】:

这里有个小问题。

我有一个 UIBarButtonItem,它与另一个表视图进行了连接。当用户在这里完成时,我已经实现了一个 unwind segue 回到第一个表视图。除了 UIBarButtonItem 在 unwind segue which can be seen here 之后仍然被选中/突出显示之外,一切正常。我不知道为什么会这样,想知道如何解决这个问题?

提前致谢。

编辑:当我说它是嵌入式时,我的意思是 this

【问题讨论】:

  • 按钮还是选中了还是表格行还是选中了?如果是 tablerow,那么在 didSelectRowAt 添加 self.tableView.deselectRow(at: indexPath, animated: true)
  • 查看我自己的答案,了解为什么会这样。
  • 你的 unwind segue 是如何实现的?您的 vc 是否嵌入在导航控制器中?
  • @Xcoder 我在链接中添加了一张图片。这是否发生在您的问题中?我看了你的回答,但不知道如何自己解决导航泄漏问题

标签: ios swift uibarbuttonitem


【解决方案1】:

这是IOS 11.2的一个bug,我这样解决的:

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

【讨论】:

    【解决方案2】:

    使用导航控制器可能会导致此问题。使用 popToViewController 可能会解决问题。只需将 MyViewController 替换为您要访问的 VievController。

    let vc = self.navigationController?.viewControllers
    
    for v in vc! {
    
        print("viewcontroller is: \(v)")
        if v as? MyViewController != nil {
            self.navigationController?.popToViewController(v, animated: false)
        }                    
    }
    

    【讨论】:

    • 所以我应该创建一个导航控制器类?目前,我的故事板中只有导航控制器。我应该把这段代码放在哪里?
    • 删除你创建的segue并向UIBarButtonItem添加一个动作。将此代码放入按钮的操作中。
    • 我试过了,没用。我删除了 segue 并向 barbuttonitem 添加了一个动作,运行它,虽然它转到了第二个视图控制器,但当我回到第一个视图控制器时,按钮仍然被选中/突出显示,如我的问题中显示的图像所示。需要明确的是:第二个视图控制器的转场起作用,按钮的行为发生在展开转场之后
    【解决方案3】:

    对于仍在试图弄清楚如何解决此问题的任何人来说,这是一个快速的解决方法。转到您的 unwind segue 方法,然后在其中输入以下代码:

     if self.navigationItem.rightBarButtonItem?.style == .plain {
            self.navigationItem.rightBarButtonItem?.style = .done
        }
     if self.navigationItem.rightBarButtonItem?.style == .done {
            self.navigationItem.rightBarButtonItem?.style = .plain
        }
    

    它可能不适用于所有情况,但对我有用。 (虽然我真的不知道它为什么会起作用)

    【讨论】:

      最近更新 更多