如何在使用当前模式打开另一个视图控制器后设置导航项的标题 - Swift

Posted

技术标签:

【中文标题】如何在使用当前模式打开另一个视图控制器后设置导航项的标题 - Swift【英文标题】:How to set title of navigation item after open another view controller using with present modally - Swift 【发布时间】:2019-10-15 14:28:39 【问题描述】:

我的应用程序中有两个视图控制器。根视图控制器有一些组件,其中一个是按钮。该按钮提供使用当前功能打开另一个视图控制器。点击按钮时打开的第二个视图控制器(SelectTimeViewController)已成功打开。我正在尝试设置导航标题和项目,但我看不到它们。

我没有使用故事板,所以根视图控制器是从 AppDelegate 设置的。

let viewController = ViewController()
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = UINavigationController(rootViewController: viewController)
window?.makeKeyAndVisible()

当点击按钮时,“openVC”函数被调用。

@IBAction func openVC(_ sender: Any) 
    self.navigationController?.present(SelectTimeViewController(), animated: true, completion: nil)

我正在尝试在 SelectTimeViewController 的 viewDidLoad 函数中设置 title 和 rightBarButtonItem 但我看不到它们。

override func viewDidLoad() 
        super.viewDidLoad()
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(named: "close"), style: .plain, target: self, action: #selector(closeIt))
        self.navigationItem.title = "Select Time"

除此之外,当更改“openVC”功能时,我可以看到标题和右栏按钮项,如下所示。

@IBAction func openVC(_ sender: Any) 
    self.navigationController?.pushViewController(vc, animated: true)

【问题讨论】:

【参考方案1】:

你必须推送 SelectTimeViewController 而不是 present

或者如果你真的想展示它,你应该展示另一个 UINavigationController,它的 rootViewController 为 SelectTimeViewController()

【讨论】:

这个解决方案有效,但有些事情我想知道。为什么我们需要使用 2 UINavigationController?它是呈现视图的正确方式吗? 将其视为流程或故事。每个导航控制器都包含一个完整的流程,每当您想启动一个新流程时,您都会呈现一个新的导航控制器,您可以在其中推送所有页面,然后从该流程中关闭所有内容

以上是关于如何在使用当前模式打开另一个视图控制器后设置导航项的标题 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ios 9 中以编程方式导航到另一个具有“当前上下文”表示的视图控制器,目标 C

如何在 tableview 中为图像设置动画以同时扩展和打开另一个视图控制器?

如何使用 UIGestureRecognizer 交换视图

横向播放视频后状态栏下的导航栏

如何从 popoverpresentation 视图控制器导航到另一个视图控制器

从 App Delegate 打开导航控制器