【问题标题】:Passing data between view controllers when using a tab bar controller使用标签栏控制器时在视图控制器之间传递数据
【发布时间】:2021-08-25 22:17:39
【问题描述】:

我在视图控制器之间传递数据时遇到问题。

我尝试使用prepare(for: segue) 并在目标视图控制器上设置一个属性,但我在调试应用程序时设置了断点,当用户单击底部标签栏上的按钮时,该函数似乎没有被调用导航控制器。

这是用户浏览我的应用程序的主要方式,所以我想知道是否还有其他方式。

我知道您可以使用segue.identifier 来确定触发了哪个转场,但我没有在这些转场上看到标识符属性。

当我单击将导航控制器连接到视图控制器的线时,属性窗格上没有标识符属性。

情节提要将其称为“关系转场”,并具有“选择器”属性(请参阅随附的屏幕截图)。

这是我用来识别用户单击了哪个标签栏按钮的方法吗?

如果不调用prepare(for: segue),我将如何触发属性设置?

【问题讨论】:

    标签: ios swift navigation segue


    【解决方案1】:

    您的问题标题询问的是导航控制器,但您的问题的其余部分和图片是关于标签栏控制器的,所以我假设这就是您要问的。

    这里有两种不同的情况:

    1. 首次创建各种包含的视图控制器时;这是由关系segues 处理的,但这些不是导致prepare(for:sender:) 被调用的segues。这些“segues”只是代表故事板中的关系,使UITabBarController 能够加载嵌入式视图控制器。
    2. 当用户在不同选项卡之间切换时 - 这似乎是您要询问的方式。这不是使用 segues 处理的,因此将代码放入 prepare(for:sender:) 将无济于事。

    您可以做的是创建一个UITabViewController 的子类,并在情节提要中使用它来代替标准的UITabViewController

    现在,您可以在子类中覆盖 viewDidLoad 并通过 self.viewControllers 访问嵌入式视图控制器 - 这使您可以初始访问这些视图控制器,以便您可以自定义它们的初始状态。

    如何处理选项卡切换?

    UITabViewController 符合 UITabBarDelegate。这意味着您的子类可以实现[tabBar(_:didSelect)](https://developer.apple.com/documentation/uikit/uitabbardelegate/1623463-tabbar)。每次用户选择选项卡时都会调用此函数。在此函数中,您可以使用selectedViewController 属性来获取新选择的视图控制器,将其转换为适当的类型并根据需要设置其属性。

    
    class MyTabBarController: UITabBarController {
    
        override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        
            if let vc = self.selectedViewController as? Tab0ViewController {
                vc.someProperty=someValue
            } else if let vc = self.selectedViewController as? Tab1ViewController {
                vc.someProperty=someValue
            }
        }
    }
    

    但是,如果您将视图控制器设置为使用共享数据模型,则可能没有必要这样做。

    您的视图控制器可以观察模型,并且无论何时更新您的模型,这些更改都可以通过其他方法传达给各种视图控制器;例如,您可以使用组合或通知。

    然后,当用户切换选项卡时,视图控制器已经显示了正确的信息。

    这完全取决于您要达到的目标。

    【讨论】:

    • 感谢您对 Paulw11 的详细解释。我试图通过创建一个子类 UITabBar 并实现 [tabBar(_:didSelect)] 的 CustomTabBarController 类来实现您的解决方案。但是,我收到一条错误消息:“UITabBar”类型的值没有成员“selectedViewController”。如果我无法获得对所选视图控制器的引用,我不确定如何在其中设置变量。
    • 抱歉,打错了,应该是self.
    • 我将它更改为 self.selectedViewController 现在它可以编译,但是当我选择一个新选项卡时,[tabBar(_:didSelect)] 函数无法访问。我在函数中设置了断点并运行了应用程序,但调试器从未遇到断点。我确实将 TabBarController 场景的类更改为我的 CustomTabBarController 类,所以不是这样。
    • 我更新了图像以显示整个故事板布局。我正在使用一个标签栏控制器,然后链接到几个导航控制器。
    • 抱歉,didSelect 的签名中还有一个错误应该是 UITabBarItem,而不是 Int
    猜你喜欢
    • 1970-01-01
    • 2015-02-10
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2011-07-09
    相关资源
    最近更新 更多