我如何“保存” UIStepper的值,以便当我返回其视图控制器时它保持不变

问题描述

我很难在两个视图控制器之间保存/移动数据。具体来说,我在第二个视图控制器上有一个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)
}

'''

解决方法

如果我对问题的理解正确,我认为您有两个问题需要解决。

  1. 第二视图控制器需要以某种方式通知第一视图控制器已进行了更改。 NotificationCenter是执行此操作的一种方式
  2. 将步进器的值更新为已保存的值。

在第一个视图控制器中

@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是我设置用来演示的一个小演示

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...