使用导航栏在 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 时,数据对象中的数据将被更改。
我不确定我是否正确设置了它:您可以使用导航栏在计算器视图控制器和设置视图控制器之间导航,然后返回...在设置选择器或分段控件时,数据不会通过下面的代码传回计算器视图控制器。我认为这是因为我的故事板上没有相应的 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 时,数据对象中的数据将被更改。