IOS 14.2, lorsque j'ai essayé de présenter un contrôleur NavigationController par programme avec l'extrait de code ci-dessous.

@objc private func handleClick() {
    let viewController = MyViewController()
    
    self.present(viewController, animated: true, completion: nil)
}

Le titre de la barre dans le nouveau contrôleur ne sera pas rendu. Est-ce que je manque quelque chose?

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

        self.title = "TEST" // NOT WORK
        self.navigationItem.title = "Title" // NOT WORK
    }
}

enter image description here

J'ai également essayé l'extrait de code ci-dessous pour imbriquer un contrôleur de vue normal dans un UINavigableController, mais le titre n'est toujours pas rendu.

@objc private func handleHelpClick() {
    let innerVC = MyInnerViewController()
    innerVC.title = "TEST"
    let viewController = UINavigationController(rootViewController: innerVC)
    self.present(viewController, animated: true, completion: nil)
}
0
Metropolis 18 oct. 2020 à 11:42

2 réponses

Meilleure réponse

La documentation dit:

Un contrôleur de navigation crée le contenu de la barre de navigation de manière dynamique à l'aide des objets d'élément de navigation (instances de la classe UINavigationItem) associés aux contrôleurs de vue sur la pile de navigation.

https://developer.apple.com/documentation/uikit/uinavigationcontroller

Donc, d'après ce que j'ai compris, vous devez définir le titre de votre UIViewController lui-même à la place du UINavigationController.

Exemple:

class MyViewController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

class ViewController: UIViewController {
    
    private lazy var button: UIButton = {
        let btn = UIButton()
        btn.translatesAutoresizingMaskIntoConstraints = false
        btn.setTitle("Display NavVC", for: .normal)
        btn.setTitleColor(.blue, for: .normal)
        btn.addTarget(self, action: #selector(displayNavVC), for: .touchUpInside)
        return btn
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .systemBackground
        configureButton()
    }
    
    private func configureButton() {
        view.addSubview(button)
        NSLayoutConstraint.activate([
            button.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            button.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        ])
    }
    
    @objc
    private func displayNavVC() {
        let vc = UIViewController()
        vc.title = "abc"
        let navigationVC = MyViewController(rootViewController: vc)
        
        self.present(navigationVC, animated: true, completion: nil)
    }
}

Résulte en:

enter image description here

2
finebel 18 oct. 2020 à 09:16

Réponse de @ finebel dans Playground

import UIKit
import PlaygroundSupport

class MyViewController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

class ViewController: UIViewController {
    
    private lazy var button: UIButton = {
        let btn = UIButton()
        btn.translatesAutoresizingMaskIntoConstraints = false
        btn.setTitle("Display NavVC", for: .normal)
        btn.setTitleColor(.blue, for: .normal)
        btn.addTarget(self, action: #selector(displayNavVC), for: .touchDown)
        return btn
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        configureButton()
    }
    
    private func configureButton() {
        view.addSubview(button)
        NSLayoutConstraint.activate([
            button.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            button.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        ])
    }
    
    @objc
    private func displayNavVC() {
        let vc = UIViewController()
        vc.title = "abc"
        let navigationVC = MyViewController(rootViewController: vc)
        
        self.present(navigationVC, animated: true, completion: nil)
    }
}

// Present the view controller in the Live View window
PlaygroundPage.current.liveView = ViewController()

enter image description here

0
Metropolis 18 oct. 2020 à 10:06