创建自定义 UINavigationcontroller class

Create a custom UINavigationcontroller class

我已经对我的嵌入式 UINavigationcontroller 进行了以下自定义。我在将首先显示的视图的视图控制器中完成了此操作。

但是我正在尝试通过创建一个单独的 class 来清理它,以便我的 UIView class 中没有这一切。我目前使用的代码

self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: "navigation.background"), for: .default)

let backButton = UIImage(named: "Back.button")?.withRenderingMode(.alwaysOriginal)
let backButtonHigh = UIImage(named: "Back.button.highlighted")?.withRenderingMode(.alwaysOriginal)


self.navigationController?.navigationBar.backIndicatorImage = backButton
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = backButtonHigh
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

我尝试做的是像这样 class 在新的 class 中扩展 UInavigationcontroller

class RSRNavigationController: UINavigationController{
    override func viewDidLoad() {
        super.viewDidLoad()

self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: "navigation.background"), for: .default)

let backButton = UIImage(named: "Back.button")?.withRenderingMode(.alwaysOriginal)
let backButtonHigh = UIImage(named: "Back.button.highlighted")?.withRenderingMode(.alwaysOriginal)

self.navigationController?.navigationBar.backIndicatorImage = backButton
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = backButtonHigh
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

这行不通。它会 运行 没有问题,但它实际上不会做任何事情。

我也尝试过以下操作

class RSRNavigationController: UINavigationBar{
    override func draw(_ rect: CGRect) {
        super.draw(rect)
        self.setBackgroundImage(UIImage(named: "navigation.background"), for: .default)
        let backButton = UIImage(named: "Back.button")?.withRenderingMode(.alwaysOriginal)
        let backButtonHigh = UIImage(named: "Back.button.highlighted")?.withRenderingMode(.alwaysOriginal)
        self.backIndicatorImage = backButton
        self.backIndicatorTransitionMaskImage = backButtonHigh
        //self.backItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }

但是我似乎无法设置后退按钮的标题。

有人知道如何解决这个问题吗?

您的问题出在这里,当您在自定义导航控制器中引用导航控制器时 class

而不是做

self.navigationController?.navigationBar.backIndicatorImage = backButton

这样做

self.navigationBar.backIndicatorImage = backButton

原因?

因为当您通过 UINavigationController 扩展自定义 class 时,它本身就变成了导航控制器。通过执行 self.navigationController,您告诉您的应用程序寻找您的自定义 navigationCOntroller 所在的 navigationController。当然,这样的导航控制器不存在,因为您的自定义 navController 是应用程序的主要或顶部 navController。因此,只需从您的自定义 class 中删除 self.navigationController 部分,您在 viewDidLoad 中编写的其余代码应该可以正常工作。

如果还有什么问题欢迎随时提问

您不会在导航控制器本身中更改这些属性,而是在嵌入在导航控制器中的 viewController 中更改它。 这些自定义必须在视图控制器的父级 ViewController 中完成。

这个答案有更多信息:

如果您只想自定义导航栏的后退按钮,您可以在您的子视图控制器中添加此代码:

func setupLeftBarItem() -> Void {
    let originalImage = UIImage.init(named: "leftBatItem")?.withRenderingMode(.alwaysOriginal)
    let leftBarItem = UIBarButtonItem.init(image: originalImage, style: .done, target: self, action: #selector(leftBarButtonItemDidTouch))

    navigationItem.leftBarButtonItem = leftBarItem
}

func leftBarButtonItemDidTouch() -> Void {
     _ = navigationController?.popViewController(animated: true)
}