我正在使用:XCode 8.2,Swift 3.0,iOS 10.2,iPhone 7.我有Tab Bar Controller
个孩子View Controllers
。
我正在尝试将数据从一个视图控制器发送到另一个视图控制器。
我已经查找了如何执行此操作here和here,但是第一个链接并不是我想要的,因为他正在讨论没有' t似乎是在标签之间移动时使用的相同类型的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
}
}
我不确定这是否正确但是...我还有一个自定义类附加到我的标签栏控制器:
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
。当然,这甚至无法编译/构建,我不确定从哪里开始。任何帮助将不胜感激。
答案 0 :(得分:4)
好吧,我自己弄清楚,正如@Leo Feng所说,我不需要使用委托模式。这个答案证明是有帮助的:Passing data between tab viewed controllers in swift?
就我而言,它更像是:
在发送视图控制器中:
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
}
}
}
答案 1 :(得分:1)
我认为你不需要在这里使用委托模式。如果选中了选项卡,则子视图控制器将加载 - 这意味着将立即调用所有视图循环方法。您可以在子视图控制器的viewDidLoad,viewWillAppear和viewDidAppear中设置数据。