切换选项卡时将数据发送到控制器

时间:2019-03-30 19:55:33

标签: ios swift xcode swift4

我的应用程序有4个标签。在第四个标签上,有一个“登录”到应用程序的选项,它将用户带到“登录”控制器。用户登录后,我想将用户切换回第一个选项卡,我使用以下代码进行操作:

self.tabBarController?.selectedIndex = 0

但是,我想在用户登录后刷新第一个选项卡上的内容(因为该内容是特定于用户的)。这意味着当用户切换选项卡时,我需要传递一些数据,以使第一个选项卡中的控制器知道刷新数据。

在选项卡之间切换以刷新内容时,如何将数据发送到第一个选项卡?还是有更好的方法解决这个问题?

3 个答案:

答案 0 :(得分:1)

enter image description here enter image description here

您可以通过使用通知/观察者或委托模式来实现。

由于这似乎是一对一的关系,您应该使用委托模式,因为通知和观察者用于一对多的关系。

  1. 在第四个选项卡视图控制器代码上方创建一个协议。该函数的参数将是您将从一个ViewController传输到另一个ViewController的数据。在此示例中,我传输了textField的文本,用户可以在其中输入名称:

    protocol SelectionDelegate {
        func didTapChoice(name: String)
    }
    
  2. 在第4个标签视图控制器中添加一个委托变量:

    var selectionDelegate: SelectionDelegate!
    
  3. 在@IBAction中调用委托变量的功能:

    selectionDelegate.didTapChoice(name: textField.text!)
    tabBarController?.selectedIndex = 0
    
  4. 在第二个viewcontroller的viewDidLoad()中将选择委托分配给第一个viewcontroller:

    selectionDelegate = tabBarController?.viewControllers?[0] as? SelectionDelegate
    
  5. 在第一个选项卡视图控制器的底部添加扩展,以实现协议功能:

    extension FirstTabViewController: SelectionDelegate {
        func didTapChoice(name: String) {
            displayLabel.text = name
        }
    }
    

这是第一个视图控制器的结果:

import UIKit

class FirstTabViewController: UIViewController {

    @IBOutlet weak var displayLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

extension FirstTabViewController: SelectionDelegate {
    func didTapChoice(name: String) {
        displayLabel.text = name
    }
}

这是第二个视图控制器的结果:

import UIKit

protocol SelectionDelegate {
    func didTapChoice(name: String)
}

class SecondTabViewController: UIViewController {
    var selectionDelegate: SelectionDelegate!

    @IBOutlet weak var textField: UITextField!

    @IBAction func goToFirstTabButtonTapped(_ sender: UIButton) {
        selectionDelegate.didTapChoice(name: textField.text!)
        tabBarController?.selectedIndex = 0
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        selectionDelegate = tabBarController?.viewControllers?[0] as? SelectionDelegate
    }
}

答案 1 :(得分:0)

在第一个选项卡的视图控制器中编写一个方法(例如 yourCustomMethod()),然后可以使用:-

从第四个选项卡的视图控制器中访问该方法
    if let navigationController = self.tabBarController?.childViewControllers[0],
        let firstVC = navigationController.childViewControllers[0] as? FlightsHomeViewController {

        let yourData = ["username": "something"]
        firstVC.yourCustomMethod(data: yourData)
    }

答案 2 :(得分:0)

  1. 第一个VC 中。收听登录通知。
  2. 登录VC 中。用户登录时。发布登录通知。