使用导航栏在 Swift 中的 ViewController 之间存储数据

Storing data between ViewControllers in Swift using Nav Bar

我不确定我是否正确设置了它:您可以使用导航栏在计算器视图控制器和设置视图控制器之间导航,然后返回...在设置选择器或分段控件时,数据不会通过下面的代码传回计算器视图控制器。我认为这是因为我的故事板上没有相应的 segue 指向计算器视图控制器。我会这样做,但为什么后退按钮不显示在设置视图控制器的故事板上?如果是这样,我可以控制拖回计算器视图控制器吗?我肯定错过了什么?

此外,我不只是希望 picker/segmented 控制数据被使用一次,即我不想在用户返回设置时重置 viewcontroller,我想要这些选择只要应用程序打开,就会保存。我怎么做?

我能找到的唯一其他现有答案在 Objective C

代码:

class settingsViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {



let titleData = TitleData()
var selectedCounty = String?("Allegany")
var priceMax = Float(1000000)
var priceMin = Float(0)
var payoffMax = Float(1000000)
var payoffMin = Float(0)

@IBOutlet weak var countyPicker: UIPickerView!

@IBOutlet weak var segmentedControl: UISegmentedControl!

override func viewDidLoad() {
    super.viewDidLoad()
    countyPicker.delegate = self
    countyPicker.dataSource = self

}




@IBAction func indexChanged(sender: UISegmentedControl) {
    switch segmentedControl.selectedSegmentIndex
    {
    case 0:
        priceMax = 500000.0
        priceMin = 0.0
    case 1:
        priceMax = 1000000.0
        priceMin = 500000.0
    case 2:
        priceMax = 2000000.0
        priceMin = 1000000.0
    case 3:
        priceMax = 5000000.0
        priceMin = 2000000.0
    default:
    break
    }
}



func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return titleData.mdCounties.count


}

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    selectedCounty = titleData.mdCounties[row].name
}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {

    return titleData.mdCounties[row].name!
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var destViewController: FirstViewController = segue.destinationViewController as! FirstViewController
    destViewController.selectedCounty = selectedCounty
    destViewController.newPriceMax = priceMax
    destViewController.newPriceMin = priceMin
    destViewController.newPayoffMax = payoffMax
    destViewController.newPayoffMin = payoffMin
}

}

这是关于堆栈溢出的常见问题解答。它可以概括为 "how do I pass data between ViewControllers." 它并不特定于 Swift。 Objective-C 和 swift 中的技术相同。唯一改变的是您用来实现它的语言。

执行此操作的最全局、最灵活的方法是创建一个数据容器单例来保存您的应用程序状态。设置您的单例以将应用程序状态保存到文件(用户默认值,或保存到应用程序文档目录中的文件。

任何时候你想保存应用数据,把它保存到单例中。任何时候你想读取应用程序数据,从单例中读取它。

如果你有一个更具体的情况,你想在一个视图控制器和你 segue 到的另一个视图控制器之间传递数据,你可以在 prepareForSegue 中将数据对象传递到目标视图控制器。然后你可以在第二个视图控制器中更改数据对象,当你从 segue 中 return 时,数据对象中的数据将被更改。