Я использую VIPER и пытаюсь реализовать собственный NavBarController.

Я пытаюсь создать пользовательскую панель навигации и хочу добавить заголовок слева и значок чата справа.

Вот так

Дизайн пользовательского интерфейса NavBar

но он не показывает ни одного элемента. Цвет фона — единственный работающий пользовательский интерфейс.

Я называю это так

let garageVC = HomeNavController(rootViewController: GarageRouter.assembleModule(), title: "My Garage")

Мой курс навигации

import UIKit

class HomeNavController: UINavigationController {
    
    var tabTitle: String?
    
    init(rootViewController: UIViewController, title: String) {
        super.init(rootViewController: rootViewController)
        self.tabTitle = title
        configure()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        configure()
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        configure()
    }
    
    private func configure() {
        
        navigationBar.isHidden = false
        navigationBar.isTranslucent = false

        navigationBar.tintColor = .white
        navigationBar.barTintColor = .primary
        
        let nameLabel = UILabel(frame: .zero)
        nameLabel.textColor = .white
        nameLabel.tintColor = .white
        nameLabel.text = tabTitle
        navigationItem.leftBarButtonItem = UIBarButtonItem(customView: nameLabel)

        
        let chatButton = UIButton(type: .system)
        chatButton.setImage(UIImage(named: "home-chat")?.withRenderingMode(.alwaysOriginal), for: .normal)
        navigationItem.rightBarButtonItem = UIBarButtonItem(customView: chatButton)
        chatButton.imageEdgeInsets = UIEdgeInsets(top: 0.0, left: 0, bottom: 0, right: -10)
        chatButton.addTarget(self, action: #selector(chatClicked), for: .touchUpInside)
        
    }
    
    @objc func chatClicked() {
        print("Chat clicked")
    }
}

Вывод

мой дизайн вывода


person Sala7Khaled    schedule 28.12.2020    source источник


Ответы (3)


Вы можете создать собственное представление с меткой и кнопкой и установить его как titleView на navigationItem из HomeNavController.

Проверьте этот ответ

РЕДАКТИРОВАТЬ:

В качестве альтернативы вы можете установить новую метку как leftBarButtonItem

Как выровнять заголовок панели навигации по левому краю в Xcode?

person Witek Bobrowski    schedule 28.12.2020
comment
Я попробовал оба ответа, но, к сожалению, ничего не изменилось - person Sala7Khaled; 28.12.2020
comment
Вы уверены, что устанавливаете правильный tabTitle и значение не равно нулю? - person Witek Bobrowski; 28.12.2020

Если вы хотите реализовать эту навигацию на другой странице, вы можете просто создать собственный контроллер представления вместо создания собственного контроллера навигации.

import UIKit

class CustomViewController: UIViewController {
    
    var tabTitle: String?

    override func viewDidLoad() {
        super.viewDidLoad()
        configure()
    }

    private func configure() {
    
        navigationController?.navigationBar.isHidden = false
        navigationController?.navigationBar.isTranslucent = false

        navigationController?.navigationBar.tintColor = .white
        navigationController?.navigationBar.barTintColor = .primary
    
        let nameLabel = UILabel(frame: .zero)
        nameLabel.textColor = .white
        nameLabel.tintColor = .white
        nameLabel.text = self.tabTitle
        navigationItem.leftBarButtonItem = UIBarButtonItem(customView: nameLabel)

    
        let chatButton = UIButton(type: .system)
        chatButton.setImage(UIImage(named: "home-chat")?.withRenderingMode(.alwaysOriginal), for: .normal)
        navigationItem.rightBarButtonItem = UIBarButtonItem(customView: chatButton)
        chatButton.imageEdgeInsets = UIEdgeInsets(top: 0.0, left: 0, bottom: 0, right: -10)
        chatButton.addTarget(self, action: #selector(chatClicked), for: .touchUpInside)
    
    }

    @objc func chatClicked() {
         print("Chat clicked")
    }
}

Теперь, если вы хотите изменить контроллер представления с той же панелью навигации, вы можете использовать CustomViewController.

class HomeViewController: CustomViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

}

И если вы хотите изменить заголовок, вы можете установить заголовок контроллера представления перед представлением или добавить в rootviewcontroller.

let viewController = HomeViewController()
viewController.tabTitle = "Hommme"
let navController = CustomViewController(rootViewController: viewController)
self.present(navController!, animated: true, completion: nil)

Если вы используете раскадровку, вы можете изменить название контроллера представления в инспекторе атрибутов.

Примечание:

  • Вам нужно настроить код, если вы хотите изменить заголовок в середине презентации.
  • Если эта панель навигации отображается только на 1 странице, вам просто нужно напрямую изменить контроллер представления, а не создавать собственный контроллер представления.
person Muhammad Reza Fajar Aditya    schedule 28.12.2020
comment
Спасибо за ваши усилия. Кажется, ваш ответ сработает, но, к сожалению, я использую BaseController во всех своих VC и не хочу реализовывать на нем панель навигации. - person Sala7Khaled; 28.12.2020

Я полужестко закодировал это. Я реализовал функцию configure() на своем контроллере представления, и она работает. К сожалению, мне приходится перетаскивать эту функцию для каждого контроллера представления на моем tabBar.

person Sala7Khaled    schedule 12.01.2021