ios - 将数据从第一个 VC 传递到第三个 (Swift)

标签 ios swift xcode swift3 uiviewcontroller

我有 3 个 viewController,我以这种方式将数据从第一个 View Controller 传递到第二个 View Controller (这是第一个 VC)

 var steppers : UIStepper?

    @IBOutlet weak var hourLabel: UILabel!
    @IBOutlet weak var stepper: UIStepper!

    @IBAction func stepper(_ sender: UIStepper) {

      hourLabel.text = String(sender.value)
    }


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let nc = segue.destination as? SelectClass {
            nc.limit = Int(stepper.value)
        } }

在第二个 VC 中,我有 var limit = 0。到目前为止,一切正常,但我想做的是将用户提供给步进器的值传递给第三个 VC。我尝试在第三个 VC 中创建另一个变量 var limit2 = 0 并以这种方式将数据从第二个 VC 传递到第三个

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? ThirdClass {
            vc.limit2 = limit
        } }

但没有结果,我的 var limit2 = 0 它始终具有值 0,而不是采用我用步进器添加的值。我该怎么办?

这是第二个VC中的准备

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == nearbySearchSegueIdentifier {
            guard let category = sender as? QCategoryy else {
                return
            }
            if let selectedRows = tableView.indexPathsForSelectedRows {

                if let vc = segue.destination as? ThirdClass {
                vc.category = category
                vc.limit2 = limit
            }
        }
    }
}

最佳答案

考虑到您当前的代码,有可能 limit2 未设置,因为此条件无效:

// This condition could be failing sometimes
if let selectedRows = tableView.indexPathsForSelectedRows {
    if let vc = segue.destination as? ThirdClass {
        vc.category = category
        vc.limit2 = limit
    }
}

根据DocumentationindexPathsForSelectedRows返回一个可选值,并且在您的segue中,只有当该值不为零时您才设置limit2

尝试在任何条件之外设置 limit2,这样它将始终执行,并且如果您需要满足条件才能执行segue,检查shouldPerformSegue(withIdentifier:sender:) here

此外,如果 VC3 上所需的值与离开 VC1 时所需的值相同,则可以使用不同的方法在它们之间传递数据,而不必依赖 VC2。

一种可能是在 VC1 中创建一个静态变量,并在推送到 VC2 之前设置限制值:

var steppers : UIStepper?

    @IBOutlet weak var hourLabel: UILabel!
    @IBOutlet weak var stepper: UIStepper!

    // ADD THIS
    static var globalLimit: Int = 0

    @IBAction func stepper(_ sender: UIStepper) {
      hourLabel.text = String(sender.value)
    }


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let nc = segue.destination as? SelectClass {
            nc.limit = Int(stepper.value)
            // AND THIS
            VC1ClassName.globalLimit = Int(stepper.value)
        } 
}

然后在 VC3 内部随时加载您的全局值(可能是 viewDidLoad):

override func viewDidLoad() {
    super.viewDidLoad()
    limit2 = VC1ClassName.globalLimit
}

您还可以创建一个 StepperManager 类或类似的类来负责管理数据,而不是通过 ViewController 传递数据,并且您可以随时从所需的每个类访问它.

关于ios - 将数据从第一个 VC 传递到第三个 (Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46949829/

相关文章:

ios - 为单元格的 subview 实现不同的用户交互功能

ios - 构建步骤 'Xcode' 将构建标记为失败 - Jenkins iOS

ios - 删除等宽约束和调整按钮

ios - 是否可以从 touchesBegan 或 touchesMoved 中取消触摸?

ios - iOS 7 和 iOS8 中的 Alert View 与 UIAlertController

ios - 使用 UIButton 实现 UIDatePicker 和 UIPickerView

ios - Xcode 和 Flutter 插件 : Could not find or use auto-linked framework 'Flutter'

c++ - 如何判断 C++ 符号是否在 Xcode 中被#defined

ios - 无法完全删除 Fabric 和 Crashlytics

iphone - 为 iOS 设计线程评论系统