准备在UITabbarController中调用segue

时间:2017-10-22 17:48:39

标签: ios swift delegates uitabbarcontroller

我已经浏览了关于这个主题的所有其他帖子,但他们似乎没有帮助我。

我有一个启动两个标签的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)
    }

}

2 个答案:

答案 0 :(得分:0)

执行segue时会调用

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