如何与一系列视图控制器之间传递数据

时间:2016-04-08 22:26:49

标签: ios swift segue

我已经能够将数据从一个视图传递到下一个视图。

现在我需要扩展一下并通过三个视图控制器传递这些数据。

我有三个视图控制器1.MileageControler,2.LocationsControler和3.LocationChoiceController。

我需要能够将数据从1传递到2然后传递到3然后再传回到2。

Mileage Controler有一个文本框和一系列数字按钮,允许用户输入里程。一个Enter按钮在seque上传递了以下内容

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "segueLocationView") {
        let passingData = segue.destinationViewController as! LocationViewController;

        passingData.mileageToPass = DisplayStart.text
        passingData.fuelAmountToPass = 0.00
        passingData.startLocationToPass = "HOME"
        passingData.endLocationToPass = ""
    }
}

LocationController有:

    var mileageToPass: String!
    var fuelAmountToPass: Double!
    var startLocationToPass: String!
    var endLocationToPass: String!

    override func viewDidLoad() {
        super.viewDidLoad()

        labelStartMileage.text = "Start Mileage for this trip: " + mileageToPass
        labelStartLocation.text = startLocationToPass
        labelEndLocation.text = endLocationToPass
}

它也有......

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

    if (segue.identifier == "segueChoiceMade") {

        let passingData = segue.destinationViewController as! LocationChoiceViewController;

        passingData.mileageToPass = mileageToPass
        passingData.fuelAmountToPass = fuelAmountToPass
        passingData.startLocationToPass = labelStart.text
        passingData.endLocationToPass = txtEndLocation.text

        if (sender === but_StartLocation) {
            passingData.senderToPass = "Start"
        } else if (sender === but_Destination) {
            passingData.senderToPass = "End"
        }

    }
}

所以在这里我试图再次将数据传递到下一个视图(LocationChoice),用户将根据该位置选择一个位置并根据传递的senderToPass值,然后将存储所选位置并将其传回startLocationToPass或endLocationToPass。仅存储并传回的LocationChoice中的mileageToPass和fuelAmmountToPass不会更改。

我遇到的问题是错误,只是显示为......线程1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)我是以错误的方式解决这个问题....

2 个答案:

答案 0 :(得分:2)

您可以创建一个新的单例类来保留您感兴趣的数据集。

这样的事情:

import Foundation

class Data: NSObject {

    static let sharedData = Data()

    var mileage: String?
    var fuelAmount: Int?
    var startLocation: String?
    var endLocation: String?
}

然后在视图控制器中,您可以获取和设置值,如:

// Set fuel amount in one view controller
Data.sharedData.fuelAmount = 0.00

// And retrieve it in another
let fuelAmount = Data.sharedData.fuelAmount

答案 1 :(得分:0)

您正确使用-prepareForSegue:sender:。你的情况非常简单,所以你可以像你一样设置值,这很棒。

提供的错误消息非常通用"发生了非常糟糕的事情",并且没有回溯可供使用。如果您还没有其他信息,我建议您在-prepareForSegue:sender:方法中设置一个断点,然后逐行踩踏,直至崩溃。

顺便说一句,我建议将你传递给模型对象的4个值(包含4个不可变值)包装起来并传递它。