使用Nav Bar在Swift中的ViewControllers之间存储数据

时间:2015-04-19 15:17:05

标签: swift uiviewcontroller uinavigationcontroller uinavigationbar

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

此外,我不仅希望选择器/分段控制数据被使用一次,即我不想在用户返回设置视图控制器时重置,我希望只要应用程序打开就保存这些选项。我怎么做?

我能找到的唯一其他现有答案是在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
}

} enter image description here

1 个答案:

答案 0 :(得分:1)

这是关于堆栈溢出的FAQ。它可以概括为“如何在ViewControllers之间传递数据”。它并不特定于Swift。这些技术在Objective-C和swift中是相同的。唯一改变的是你用来实现它的语言。

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

每当您想要保存应用数据时,请将其保存到单身人士。只要您想阅读应用数据,请从单身人士处阅读。

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