准备在 UITabbarController 中不调用 segue



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

我有一个 UITabBarController 正在启动两个选项卡。我想将 tab1 中收集的数据传递给 UITabBar ViewController。我正在尝试为此使用委托协议,但是在发送视图控制器中设置委托变量时遇到问题。准备 segue 永远不会被调用。我什至无法在选项卡栏控制器的 ViewDidLoad() 内循环浏览选项卡的视图控制器,因为它们尚未创建并且为零。

我以前使用过代表,这似乎很简单。我在标签栏中使用它有关系吗?

当我运行代码时,调用了TabBarViewController中的viewDidLoad(),但没有调用准备segue。

在密视控制器中调用 IBAction donePress,但未调用委托,因为它未设置。

这是代码——

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 calledn");
        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)
    }
}
执行

segue 时会调用prepareForSegue。你不这样做,这就是为什么它不会被调用。

segue 定义了 应用的情节提要文件。

应使用 singleton 类来存储变量并在不同的控制器之间访问它们。你声明一个这样的:

class Singleton {
    static let sharedInstance = Singleton()
    var name = ""
}

分配给单一实例:

Singleton.sharedInstance.name = "Some name"

要从任何控制器读取数据:

let name = Singleton.sharedInstance.name

首先,为什么您希望标签栏控制器接收一些信息/数据?

准备 segue 永远不会被调用。

prepareForSegue方法将在performSegue之后立即调用。那么你performSegue方法在哪里?或者你确定正在执行那种segue MeViewController

您拥有的另一个选择是使用 NotificationCenter .

最新更新