Создайте пользовательский класс UINavigationcontroller

Я выполнил следующую настройку для моего встроенного контроллера UINavigation. Я сделал это в контроллере представления, который будет отображаться первым.

Однако я пытаюсь очистить его, чтобы у меня не было всего этого в моем классе 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)
    }

Однако я не могу установить заголовок для кнопки «Назад».

Кто-нибудь знает, как это исправить?

ios,swift,uinavigationcontroller,uinavigationbar,swift3,

0

Ответов: 3


3 принят

Ваша проблема заключается здесь, когда вы ссылаетесь на navigationController ВНУТРИ своего пользовательского класса navigationController

Вместо того чтобы делать

self.navigationController?.navigationBar.backIndicatorImage = backButton

сделай это

self.navigationBar.backIndicatorImage = backButton

Причина?

Потому что когда вы расширяете свой пользовательский класс с помощью UINavigationController, он становится самим навигационным контроллером. А выполняя self.navigationController, вы указываете своему приложению искать навигационный контроллер, в котором находится ваш пользовательский навигационный контроллер. Конечно, такой контроллер nav не существует, потому что ваш пользовательский navController является основным или верхним navController приложения. Так что просто удалите часть self.navigationController из своего пользовательского класса, остальная часть кода, который вы написали в своем viewDidLoad, должна работать хорошо.

Если у вас остались какие-либо вопросы, не стесняйтесь спрашивать


Вы не изменяете эти свойства в самом контроллере навигации, вы изменяете их в ViewController, который встроен в контроллер навигации. Эти настройки должны быть сделаны в родительском ViewControllerконтроллере вашего представления.

Этот ответ имеет больше информации: https://stackoverflow.com/a/16913435/4004429


если вы просто хотите настроить backButton навигационной панели, вы можете добавить этот код в свой дочерний контроллер вида:

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, uinavigationbar, swift3,
Похожие вопросы