导航控制器和标签栏控制器

Posted

技术标签:

【中文标题】导航控制器和标签栏控制器【英文标题】:Navigation Controller and Tab Bar Controller 【发布时间】:2020-06-07 18:52:17 【问题描述】:

非常卡在一个问题上 我在导航控制器中有一个标签栏控制器 第一个选项卡上有一个日历(基本上是一个集合视图) 我正在尝试制作一个 rightbarbuttonitem 以滚动到今天的日期

我似乎只能在 tabbarcontroller 中创建按钮 我调用的函数然后在 CalendarViewController 中调用一个 但它似乎不起作用

在 tabbarcontroller 中实现条形按钮项的正确方法是什么?

在 tabbarcontroller 我有...

navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .bookmarks, target: self, action: #selector(goToToday))

@objc func goToToday() 
    print("pressed")
    CalendarViewController().goToToday()

在 CalendarViewController 我有...

 @objc func goToToday(_ animate: Bool = true) 
    print("tapped")
    calendarView.scrollToDate(Date(),animateScroll: animate)
    calendarView.selectDates([Date()])
    title = "Test"

如果我从 CalendarViewController 中的按钮调用该函数,则该函数有效。当从导航控制器调用时,我得到了两个打印命令,但仅此而已

【问题讨论】:

goToToday 创建一个新的 VC,调用它的方法然后丢弃它。 啊,我明白了。那么如果我将 tabOne 定义为 CalendarViewController,那么我可以直接调用这些函数吗? 类似... @objc func goToToday() tabOne?.calendarView.scrollToDate(Date()) tabOne?.calendarView.selectDates([Date()]) 【参考方案1】:

您应该在您用作第一个选项卡的实例上调用gotToToday,而不是像您在此处所做的那样在新实例上调用。以下是您需要在 TabBarController 中的 gotToToday 中执行的操作:

@objc func goToToday() 
    print("pressed")
    if let calendarViewController = viewControllers[0] as? CalendarViewController 
        calendarViewController.goToToday()
    

【讨论】:

完美。谢谢。我现在明白我做错了什么。跟进问题。当我在其他选项卡上时,我可以删除或隐藏 rightbarbuttonitem 吗? 隐藏栏按钮项目似乎与这个问题无关。为什么不发布另一个带有详细信息的问题并在此处分享链接,我会看看并帮助您。

以上是关于导航控制器和标签栏控制器的主要内容,如果未能解决你的问题,请参考以下文章

结合标签栏控制器和导航控制器

导航控制器和标签栏控制器

同时使用导航控制器和标签栏

创建标签栏控制器和导航控制器

iOS MapView 位于导航栏、状态栏和标签栏控制器下

按下“更多”按钮时,如何在标签栏控制器内设置导航栏颜色和单元格大小?