我已经浏览了关于这个主题的所有其他帖子,但他们似乎没有帮助我。
我有一个启动两个标签的UITabBarController。我想将tab1中收集的数据传递给UITabBar ViewController。我试图使用delegete协议,但我在发送ViewController中设置委托变量时遇到问题。对segue的准备永远不会被召唤。我甚至无法循环通过Tabbar控制器的ViewDidLoad()内的选项卡的viewcontrollers,因为它们尚未创建,因此为零。
我之前使用过代表,看起来很简单。我在Tabbar中使用它是否重要?
当我运行代码时,TabBarViewController中的viewDidLoad()被调用但不是preparefor segue。
调用MeViewController中的IBAction donePressed,但未调用委托,因为它未设置。
这是代码 -
protocol DetailsDelegate: class {
func myDetailsGathered( myDetails: MyDetails )
}
/// RECEIVING VIEW CONTROLLER
class TabBarViewController: UITabBarController, DetailsDelegate
{
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
print("prepare for segue called\n");
if let destinationViewController = segue.destination as? MeViewController
{
destinationViewController.delegate = self
}
}
override func viewDidLoad()
{
print("ViewDidLoad Called \n")
}
func myDetailsGathered(myDetails: MyDetails)
{
self.myDetails = myDetails
print("My details gathered \n")
}
}
---------------
/// SENDING VIEW CONTROLLER
class MeViewController: UIViewController
{
weak var delegate: DetailsDelegate?
override func viewDidLoad()
{
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
// I have UIButton in the view and this is invoked when its pressed.
@IBAction func donePressed(_ sender: Any)
{
var infoToPass = MyDetails()
print("looks like we are done")
delegate?.myDetailsGathered(infoToPass: myDetails)
}
}
答案 0 :(得分:0)
prepareForSegue
。你没有这样做,这也就是为什么它不被召唤。
segue定义了你的两个视图控制器之间的过渡 应用程序的故事板文件。
您应该使用singleton
类来存储变量并在不同的控制器之间访问它们。你声明一个这样的:
class Singleton {
static let sharedInstance = Singleton()
var name = ""
}
分配给单身人士:
Singleton.sharedInstance.name = "Some name"
从任何控制器读取它:
let name = Singleton.sharedInstance.name
答案 1 :(得分:-1)
首先,为什么你希望你的tabbarController接收一些信息/数据?
对segue的准备永远不会被召唤。
prepareForSegue
方法将在performSegue
之后立即调用。那你的performSegue
方法在哪里?或者您确定正在执行segue
MeViewController
那种情况吗?
您还有一个选择是使用NotificationCenter
。