swift 为什么为UINavigationItem设置自定义backBarButtonItem会导致出现两个后退按钮?

lqfhib0f  于 2022-12-10  发布在  Swift
关注(0)|答案(3)|浏览(118)

我有一个非常简单的设置。一个带有根UIViewController的UINavigationController,它用viewDidLoad上的一个自定义后退按钮项修改它的导航项。

let backButton = UIBarButtonItem(image: backArrowImage,
                                     style: .plain,
                                     target: nil,
                                     action: nil)

    navigationItem.backBarButtonItem = backButton

我希望这将完全取代系统后退按钮与标题 * 和 * 默认后退箭头图标。
但是,当我在堆栈上推入新的视图控制器时,导航栏会同时绘制新的自定义后退图标 * 和 * 系统后退图标。
这就是我看到的:

这是我所期望的样子:

8cdiaqws

8cdiaqws1#

您可以隐藏后退按钮

navigationItem.hidesBackButton = true

并将leftBarButtonItem用于自定义UIBarButtonItem

上PD

import UIKit

final class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.hidesBackButton = true
        let backItem = UIBarButtonItem(image: backArrowImage, style: .plain, target: self, action: #selector(backButtonPressed))
        navigationItem.leftBarButtonItem = backItem
    }

    @objc func backButtonPressed() {
        navigationController?.popViewController(animated: true)
    }
}
s3fp2yjn

s3fp2yjn2#

let backBarButtonItem: UIBarButtonItem = .init(
        image: UIImage(systemName: "chevron.backward"),
        style: .plain,
        target: target,
        action: action
    )
    navigationBar.topItem?.backBarButtonItem = backBarButtonItem
    navigationBar.backIndicatorImage = UIImage()
    navigationBar.backIndicatorTransitionMaskImage = UIImage()

这对我来说很有用,可以设置自定义“〈”并隐藏默认的“〈”,同时仍然保留backBarButtonItem行为

jgwigjjp

jgwigjjp3#

解决方案是设置全局UINavigationBar外观。显然,这必须在应用程序启动时完成。

UINavigationBar.appearance().backIndicatorImage = backArrowImage
UINavigationBar.appearance().backIndicatorTransitionMaskImage = backArrowImage

通过这种方法,我们可以保留标题动画和一般的后退按钮行为,如果用leftBarButtonItem补充后退按钮,这些行为将不会被保留。

相关问题