【问题标题】:Pass data from the first VC to the third (Swift)将数据从第一个 VC 传递到第三个(Swift)
【发布时间】:2018-04-07 13:42:16
【问题描述】:

我有 3 个 viewController,我正在以这种方式将数据从第一个传递到第二个(这是第一个 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 = 0it 始终具有值 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
            }
        }
    }
}

【问题讨论】:

  • 你是直接从VC1到VC3吗?
  • 是不是忘了添加连接第二个和第三个VC的segue?
  • @Malik 不,我必须通过第二个 VC
  • @Sweeper 不,我没有忘记
  • 您的代码似乎没有问题。尝试在 VC2 中的 prepareForSegue 中设置一个断点,看看是否正在分配值

标签: ios swift xcode swift3 uiviewcontroller


【解决方案1】:

考虑到您当前的代码,可能 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,请检查@ 987654326@here

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

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

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
}

除了让数据通过 ViewControllers 传递之外,您还可以创建一个 StepperManager 类 或类似的东西来负责管理数据,您可以随时从您需要的每个类中访问它.

【讨论】:

    【解决方案2】:

    如果从第一到第二到第三,你为什么不直接通过?

    第一VC:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "tosecondsegue" {
              let itemController : Second = segue.destination as! Second
              itemController.limit = 0 //Whatever you want
        }
    }
    

    第二个VC:

    var limit = 0
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
           if segue.identifier == "tothirdsegue" {
                let itemController : ThirdVC = segue.destination as! ThirdVC
                itemController.limit2 = limit
           }
    }
    

    第三个VC:

     var limit2 = 0
    
    //Use it here now
    

    【讨论】:

    • “变量在其自己的初始值内使用”我在项目 controller.limit 上收到此错误
    • 你将 'itemController.limit = ' 设置成什么?
    • itemController.limit = Int(stepper.value)
    • 如果你打印 Int(stepper.value) 你会得到什么
    • 出现错误,我无法运行模拟器,按照我尝试的方式(看看我的问题),当我进入第二个 VC 时,我得到了正确的步进器值,但是我当我从第二个进入第三个 VC 时,我没有得到任何值,所以 var limit2 = 0 的值仍然是 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 2022-01-14
    相关资源
    最近更新 更多