我正在使用:XCode 8.2,Swift 3.0,iOS 10.2,iPhone7。我有一个Tab Bar Controller
孩子View Controllers
。
我试图将数据从一个视图控制器发送到另一个。
我已经在这里和这里查看了如何执行此操作,但是第一个链接并不是我想要的,因为他谈论的是Storyboard segue,这似乎与在选项卡之间移动时使用的segue类型不同。
我尝试在其中发送数据的标签:
protocol SendResultsDelegate { func sendResults(data: String) } class SendingVC { .... if delegate != nil { let data = // some string here delegate?.sendResults(data: data!) } }
我尝试在其中接收数据并打印出来的标签:
import UIKit class ResultsViewController: UIViewController, SendResultsDelegate { @IBOutlet weak var resultsTextField: UITextView! func sendResults(data: String) { resultsTextField.text = data } }
而且我不确定这是否正确,但是...我的Tab Bar Controller也有一个自定义类:
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { let resultsIndex = 2 if item == (self.tabBar.items! as [UITabBarItem])[resultsIndex] { let sendingVC : SendingVC = segue.destinationViewController as! SendingVC SendingVC.delegate = self } }
我不确定应该是tabBar
函数还是prepare
函数。我基本上是在尝试:当用户单击“结果”选项卡时,将设置该委托,然后通过if
对ResultsViewController
可以显示文本字段的语句检查。当然,这甚至无法编译/构建,我不确定从这里开始。任何帮助将不胜感激。
好的,我自己弄清楚,正如@Leo Feng所说,我不需要使用委托模式。事实证明,此答案很有用:快速在制表符查看的控制器之间传递数据?
就我而言,它更像是:
在发送视图控制器中:
let secondTab = self.tabBarController?.viewControllers?[2] as! ResultsViewController secondTab.result_data = // my data here
在接收视图控制器中:
import UIKit class ResultsViewController: UIViewController, SendResultsDelegate { @IBOutlet weak var resultsTextField: UITextView! var result_data : String? = nil override func viewWillAppear(_ animated: Bool) { if(result_data != nil) { // do stuff with result_data } } }