如何在不同 class 中共享数据
How to share data in different class
我从 firebase 获取数据。然后使用 (prepareForSegue) 为下一个 UIView 设置值。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ToContent" {
if let indexPath = self.tableView.indexPathForSelectedRow {
firstTB = segue.destinationViewController as! FirstTabBar
firstTB.clickedRow = indexPath.row
}
}
}
FirstTabBar 是一个包含 3 个 UIView 的 TabBarController。
这 3 个 UIView classes 如何从 FirstTabBar class 获取该值?
您可以使用委派。我将用一个带有两个标签栏的更简单的示例进行解释,但您可以根据需要对其进行转换。
首先,我们必须创建一个协议和一个我们希望在我们想要的视图控制器中执行的函数。
protocol DataDelegate: class {
func didReceiveData(data: String)
}
假设我们有 FirstViewController 用于第一个 tabBar,SecondViewController 用于第二个标签栏。在 SecondViewController 中,我们必须为委托声明一个弱变量。
// In SecondViewController
weak var dataDelegate: DataDelegate?
在首先ViewController我们必须符合UITabBarControllerDelegate(不要忘记将委托设置为self在 viewDidLoad self.tabBarController?.delegate = self
) 并使用委托方法 tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController)
// MARK: - TabBarControllerDelegate
extension FirstViewController: UITabBarControllerDelegate {
func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
if let secondViewController = viewController as? SecondViewController {
secondViewController.dataDelegate = self
}
}
}
我们可以看到 viewController 是我们点击的 ViewController(在我们的例子中 第二个ViewController)。我们必须将它转换为 SecondViewController 以便我们可以访问它的属性并将 dataDelegate 设置为 self.
现在我们有义务遵守 DataDelegate 协议。我们只有一个函数必须实现 - didReceiveData().
// MARK: - DataDelegateProtocol
extension FirstViewController: DataDelegate {
func didReceiveData(data: String) {
print(data)
}
}
最后,在我们的 SecondViewController 中,我们必须说明我们希望在何处执行该函数。我会做的 viewDidAppear 但你可以在任何需要的地方做。
// In SecondViewController
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.dataDelegate?.didReceiveData("data")
}
这家伙很好地解释了委派link。希望你明白了。
简单!
通过segue传递数据即可;假设有两个控制器,firstController 和 secondController,数据是 theDataToPass,它是 CoolData
的 class
在您来自的控制器中
override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
let second = segue.destinationController as! SecondController
second.representedObject = self.theDataToPass
}
在控制器中你将要
override func viewWillAppear() {
self.thePassedData = self.representedObject as! CoolData
}
我从 firebase 获取数据。然后使用 (prepareForSegue) 为下一个 UIView 设置值。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ToContent" {
if let indexPath = self.tableView.indexPathForSelectedRow {
firstTB = segue.destinationViewController as! FirstTabBar
firstTB.clickedRow = indexPath.row
}
}
}
FirstTabBar 是一个包含 3 个 UIView 的 TabBarController。 这 3 个 UIView classes 如何从 FirstTabBar class 获取该值?
您可以使用委派。我将用一个带有两个标签栏的更简单的示例进行解释,但您可以根据需要对其进行转换。
首先,我们必须创建一个协议和一个我们希望在我们想要的视图控制器中执行的函数。
protocol DataDelegate: class {
func didReceiveData(data: String)
}
假设我们有 FirstViewController 用于第一个 tabBar,SecondViewController 用于第二个标签栏。在 SecondViewController 中,我们必须为委托声明一个弱变量。
// In SecondViewController
weak var dataDelegate: DataDelegate?
在首先ViewController我们必须符合UITabBarControllerDelegate(不要忘记将委托设置为self在 viewDidLoad self.tabBarController?.delegate = self
) 并使用委托方法 tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController)
// MARK: - TabBarControllerDelegate
extension FirstViewController: UITabBarControllerDelegate {
func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
if let secondViewController = viewController as? SecondViewController {
secondViewController.dataDelegate = self
}
}
}
我们可以看到 viewController 是我们点击的 ViewController(在我们的例子中 第二个ViewController)。我们必须将它转换为 SecondViewController 以便我们可以访问它的属性并将 dataDelegate 设置为 self.
现在我们有义务遵守 DataDelegate 协议。我们只有一个函数必须实现 - didReceiveData().
// MARK: - DataDelegateProtocol
extension FirstViewController: DataDelegate {
func didReceiveData(data: String) {
print(data)
}
}
最后,在我们的 SecondViewController 中,我们必须说明我们希望在何处执行该函数。我会做的 viewDidAppear 但你可以在任何需要的地方做。
// In SecondViewController
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.dataDelegate?.didReceiveData("data")
}
这家伙很好地解释了委派link。希望你明白了。
简单!
通过segue传递数据即可;假设有两个控制器,firstController 和 secondController,数据是 theDataToPass,它是 CoolData
的 class在您来自的控制器中
override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
let second = segue.destinationController as! SecondController
second.representedObject = self.theDataToPass
}
在控制器中你将要
override func viewWillAppear() {
self.thePassedData = self.representedObject as! CoolData
}