创建自定义 UINavigationcontroller 类

Posted

技术标签:

【中文标题】创建自定义 UINavigationcontroller 类【英文标题】:Create a custom UINavigationcontroller class 【发布时间】:2016-10-17 10:02:02 【问题描述】:

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

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

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)

我尝试做的是在这样的新类中扩展 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)
    

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

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

【问题讨论】:

【参考方案1】:

当您在自定义 navigationController 类中引用 navigationController 时,您的问题就在这里

而不是做

self.navigationController?.navigationBar.backIndicatorImage = backButton

这样做

self.navigationBar.backIndicatorImage = backButton

原因?

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

如果您还有任何问题,请随时提出

【讨论】:

【参考方案2】:

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

此答案包含更多信息: https://***.com/a/16913435/4004429

【讨论】:

【参考方案3】:

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

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)

【讨论】:

以上是关于创建自定义 UINavigationcontroller 类的主要内容,如果未能解决你的问题,请参考以下文章

使 uipagecontrol 动画看起来像 uinavigationcontrol 动画

Mysql 创建自定义函数

创建QGis的自定义DataProvider

创建自定义视图的步骤

vue创建自定义组件并监听原生事件

创建自定义事件