问题描述
我很难在两个视图控制器之间保存/移动数据。具体来说,我在第二个视图控制器上有一个UIStepper,它用作更改在第一个视图控制器上使用的变量的设置。回到第二个视图控制器时,步进器已恢复到我在情节提要面板属性检查器上设置的默认值。
我认为保存后需要使UIStepper的默认值等于其新值,但我不知道该怎么做。我在分段控件中遇到了同样的问题,我希望将剩下的所有选择保存为我的应用程序中的设置。
'''
第一视图控制器:
var volume: Double = 12
var speed: Double = 10
class ViewController: UIViewController {
@IBAction func switchOver(_ sender: Any) {
guard let destinationVC = storyboard?.instantiateViewController(withIdentifier: "popUpID") as? popUpViewController else {
return
}
present(destinationVC,animated: true,completion: nil)
}
}
第二视图控制器:
@IBOutlet weak var volumeLabel: UILabel!
@IBAction func volumeStepper(_ sender: UIStepper) {
volume = sender.value
volumeLabel.text = String(sender.value) + " fl oz"
@IBAction func currentSpeed(_ sender: UISegmentedControl) {
switch sender.selectedSegmentIndex {
case 0:
speed = 10 // takes 10 seconds
case 1:
speed = 300 // takes 5 minutes
case 2:
speed = 1200 // takes 20 minutes
case 3:
speed = 2400 // takes 40 minutes
default:
speed = 10
}
}
@IBAction func closePopUp(_ sender: Any) {
dismiss(animated: true,completion: nil)
}
'''
解决方法
如果我对问题的理解正确,我认为您有两个问题需要解决。
- 第二视图控制器需要以某种方式通知第一视图控制器已进行了更改。 NotificationCenter是执行此操作的一种方式
- 将步进器的值更新为已保存的值。
在第一个视图控制器中
@Component
class SubscriptionResolver(
private val characterReactiveRepository: CharacterReactiveRepository
) : GraphQLSubscriptionResolver {
fun allCharacters(): Publisher<Character> {
return characterReactiveRepository.findAll()
}
}
然后,在第二个View Controller中
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
if let value = UserDefaults.standard.value(forKey: "Stepper") as? Double {
label.text = String(describing: value)
}
//subscribe to changes
NotificationCenter.default.addObserver(self,selector: #selector(stepperDidChange),name: Notification.Name("stepperDidChangeValue"),object: nil)
}
// Handle Notification
@objc func stepperDidChange() {
if let value = UserDefaults.standard.value(forKey: "Stepper") as? Double {
label.text = String(describing: value)
}
}
}
这两个视图通过情节提要中的当前segue链接在一起。
Here是我设置用来演示的一个小演示