我的应用程序有4个标签。在第四个标签上,有一个“登录”到应用程序的选项,它将用户带到“登录”控制器。用户登录后,我想将用户切换回第一个选项卡,我使用以下代码进行操作:
self.tabBarController?.selectedIndex = 0
但是,我想在用户登录后刷新第一个选项卡上的内容(因为该内容是特定于用户的)。这意味着当用户切换选项卡时,我需要传递一些数据,以使第一个选项卡中的控制器知道刷新数据。
在选项卡之间切换以刷新内容时,如何将数据发送到第一个选项卡?还是有更好的方法解决这个问题?
答案 0 :(得分:1)
您可以通过使用通知/观察者或委托模式来实现。
由于这似乎是一对一的关系,您应该使用委托模式,因为通知和观察者用于一对多的关系。
在第四个选项卡视图控制器代码上方创建一个协议。该函数的参数将是您将从一个ViewController传输到另一个ViewController的数据。在此示例中,我传输了textField的文本,用户可以在其中输入名称:
protocol SelectionDelegate {
func didTapChoice(name: String)
}
在第4个标签视图控制器中添加一个委托变量:
var selectionDelegate: SelectionDelegate!
在@IBAction中调用委托变量的功能:
selectionDelegate.didTapChoice(name: textField.text!)
tabBarController?.selectedIndex = 0
在第二个viewcontroller的viewDidLoad()中将选择委托分配给第一个viewcontroller:
selectionDelegate = tabBarController?.viewControllers?[0] as? SelectionDelegate
在第一个选项卡视图控制器的底部添加扩展,以实现协议功能:
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)