【问题标题】:iOS 14 navigation bar title is not displayed in UINavigationController created programmatically以编程方式创建的 UINavigationController 中不显示 iOS 14 导航栏标题
【发布时间】:2020-10-18 08:42:44
【问题描述】:

iOS 14.2,当我尝试使用下面的代码 sn-p 以编程方式呈现 NavigationController 控制器时。

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

新控制器中的栏标题不会被渲染。我错过了什么吗?

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

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

还尝试了下面的代码 sn-p 将常规视图控制器嵌套到 UINavigableController 中,但标题仍未呈现。

@objc private func handleHelpClick() {
    let innerVC = MyInnerViewController()
    innerVC.title = "TEST"
    let viewController = UINavigationController(rootViewController: innerVC)
    self.present(viewController, animated: true, completion: nil)
}

【问题讨论】:

  • 你能在 viewdidappear 里面试试看而不是 viewdidload 吗?
  • @madara 它的行为相同,而不是呈现标题。

标签: ios swift uikit ios14


【解决方案1】:

文档说:

导航控制器使用与导航堆栈上的视图控制器关联的导航项对象(UINavigationItem 类的实例)动态构建导航栏的内容。

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

因此,据我了解,您必须为 UIViewController 本身设置标题,而不是为 UINavigationController

示例:

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)
    }
}

结果:

【讨论】:

  • 谢谢,我试过了,但它也没有以某种方式呈现标题
  • 非常感谢您的演示。让我再试一次你的例子。
  • 尝试了提供的示例,它可以在 Playground 中使用。
【解决方案2】:

@finebel 在 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()

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多