【问题标题】:Setting delegate to pass data from one tab to another设置委托以将数据从一个选项卡传递到另一个选项卡
【发布时间】:2017-01-22 23:03:56
【问题描述】:

我正在使用:XCode 8.2、Swift 3.0、iOS 10.2、iPhone 7。我有一个 Tab Bar Controller 和孩子 View Controllers

我正在尝试将数据从一个视图控制器发送到另一个。

我已经查看了如何做到这一点 herehere 但第一个链接并不是我想要的,因为他正在谈论 Storyboard segues,这似乎与使用的 segues 类型不同在选项卡之间移动时。

我尝试发送数据的选项卡:

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 可以显示文本字段。当然,这甚至无法编译/构建,我不确定从这里去哪里。任何帮助将不胜感激。

【问题讨论】:

    标签: ios swift xcode delegates


    【解决方案1】:

    好的,我自己想通了,正如@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
            }
        }
    }
    

    【讨论】:

    • 如果你的应用有超过五个标签页,这种方法是行不通的,因为标签页的顺序可以由用户改变。
    【解决方案2】:

    我认为您不需要在这里使用委托模式。如果您的选项卡被选中,您的子视图控制器将加载 - 这意味着所有视图循环方法将立即被调用。您可以在子视图控制器的 viewDidLoad、viewWillAppear 和 viewDidAppear 中设置数据。

    【讨论】:

    • 嗯,好的。那么如何将数据从一个子视图控制器传递到另一个?它是某种类型的全局变量还是我还需要使用protocol 代表?一些例子会很有帮助。
    猜你喜欢
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    相关资源
    最近更新 更多