【问题标题】:How to pass data from First TabBarItem to Second TabBarItem如何将数据从第一个 TabBarItem 传递到第二个 TabBarItem
【发布时间】:2022-01-14 06:04:52
【问题描述】:

上面我有一个带有 4 个按钮的 TabBarController。当我按下第二个 TabBarItem(Cars) 第三个 TabBarItem(Bicycles) 时,我想从第一个TabBarItem(HomeScreen) 传递一些值。 我正在使用 Swift 5,但我的主要项目中没有 SceneDelegate(是一个 3 年的项目),我只有 AppDelegate,这就是为什么我无法尝试唯一的例子我从 Stackoverflow 中发现了一个类似我的问题。 我设法以某种方式在ViewControllersTabBarController 之间传递数据,但我认为不再是正确的方法(因为该社区的一些人也在某些线程上这么说)因为当我点击不同的TabBarItems数据丢失,之后再次出现,但值错误等。 我将在下面附上一个 GIF,其中包含我在导航时遇到的错误以及我当前的代码以及指向 GitHub 上的 DEMO 项目的链接 (https://github.com/florentin89/PassDataTabBarController/)

你能帮我使用正确的实现来传递数据吗?

这是我的 HomeScreen 代码ViewController

import UIKit

class HomeViewController: UIViewController {
    
    @IBOutlet var textfieldHoldingCarsValue: UITextField!
    @IBOutlet var textfieldHoldingBicyclesValue: UITextField!
    
    var valueForCarsScreen = String()
    var valueForBicyclesScreen = String()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        
        valueForCarsScreen = textfieldHoldingCarsValue.text ?? String()
        valueForBicyclesScreen = textfieldHoldingBicyclesValue.text ?? String()
        
        if let navController = self.tabBarController?.viewControllers?[1] as? UINavigationController{
            if let carsTab = navController.children.first as? PostcodeViewController{
                carsTab.receivedValueFromHomeScreen = valueForCarsScreen
            }
        }
        
        if let navController = self.tabBarController?.viewControllers?[2] as? UINavigationController{
            if let bicyclesTab = navController.children.first as? PostcodeViewController{
                bicyclesTab.receivedValueFromHomeScreen = valueForBicyclesScreen
            }
        }
    }
    
    // Logout the user and navigate to Login screen
    @IBAction func logoutTapped(_ sender: UIBarButtonItem) {
        self.view.window?.rootViewController?.dismiss(animated: true, completion: nil)
    }
}

这是我用于第二个和第三个TabBarItemViewController 的代码:

import UIKit

class PostcodeViewController: UIViewController {
    
    @IBOutlet var receivedValueLabel: UILabel!
    
    var receivedValueFromHomeScreen = String()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    override func viewWillAppear(_ animated: Bool) {
        
        if self.tabBarController?.selectedIndex == 1 {
            receivedValueLabel.text = "Value received for Cars: \n" + receivedValueFromHomeScreen
        }

        if self.tabBarController?.selectedIndex == 2 {
            receivedValueLabel.text = "Value received for Bicycles: \n" + receivedValueFromHomeScreen
        }
    }
}

这是我在ViewControllers 之间导航时遇到的错误/故障的 GIF:

感谢您阅读本文!

【问题讨论】:

    标签: ios swift swift5


    【解决方案1】:

    原因是 PostcodeViewController 的 viewWillAppear 在你的 tabbar 的 selectedIndex 改变之前被调用了。第一次它工作正常。只需输入以下代码:

    print("selected index = \(self.tabBarController?.selectedIndex ?? -1)")
    

    在你的视野中会出现,你会看到。

    修复代码最简单的方法是将 PostcodeViewController 的逻辑从 viewWillAppear 移动到 viewDidAppear。

    【讨论】:

    • 是的,这就是修复!您在我为这个问题的答案工作时发布了!非常感谢您抽出宝贵的时间亚历山大!
    【解决方案2】:

    一个简单的解决方法可以是..将数据存储在登录类的静态变量中,您可以在其他类中访问它。

    解决方法很长,

    以编程方式创建自定义 TabBar,将数据从登录 viewController 传递到父 CustomTab 栏,并在委托的帮助下将数据传递到下一个屏幕。

    【讨论】:

    • 我的所有数据都在HomeViewController 中获取。我的LoginViewController 没有任何数据。
    • 我只是给出了一个想法,兄弟,你更了解你的课程,我只是作为例子说的......正如你的 gif 所示,你在 textFiled 中写你好,应该有一个按钮点击或观察者在文本字段上将数据保存在静态变量中。
    • 问题似乎是TabBarController的selectedIndex错误。我不知道为什么索引会变得疯狂。请看这里:recordit.co/BDAIRpzVHU
    【解决方案3】:

    解决方法是将PostcodeViewController 的代码从viewWillAppear 移动到viewDidAppear,如下所示:

        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            
            print("Selected index: \(self.tabBarController?.selectedIndex ?? -1)")
            
            if self.tabBarController?.selectedIndex == 1 {
                receivedValueLabel.text = "Value received for Cars: \n" + receivedValueFromHomeScreen
            }
    
            if self.tabBarController?.selectedIndex == 2 {
                receivedValueLabel.text = "Value received for Bicycles: \n" + receivedValueFromHomeScreen
            }
        }
    

    现在一切都很完美!

    下面的GIF:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 2018-04-07
      相关资源
      最近更新 更多