【问题标题】:Save variable before dismiss segue in SWIFT在 SWIFT 中关闭 segue 之前保存变量
【发布时间】:2020-05-28 10:15:30
【问题描述】:

我的应用程序中有 VC(不是根 VC),单击按钮后我不会在那里添加框。添加工作正常。我的 var 在另一个模型 swift 文件中 (av = ActualValues())。默认 var 为 0,每次我关闭我的 VC 时,var 回到值 0。我该如何解决它?用户默认值不起作用:/ 这是我的代码 实际值(查看 var 数量):

import Foundation
import Firebase


class ActualValues {

var id = "not changed"
var databaseID = "not changed"
var shift = 1
var product: String?
var target: Int = 0
var issueNumber: String?
var issue: String?
var issueNote: String?
var breakNumber: String?

var customer: String?
var quantity: Int = 0
var teamLeader: String?
var numberOfPeople: String?
var numberOfRejects = "0"
var reasonOfRejects: String?
var endNote: String?
var podType: String = "Not selected"
var typeOfWork = "not specified"
...

还有 statsVC:

import UIKit

class CurrentStatsViewController: UIViewController {

var av = ActualValues()
var defaultsQuantity = UserDefaults.standard.integer(forKey: "quantity")

@IBOutlet weak var menuButton: MyButton!
@IBOutlet weak var boxButton: MyButton!
@IBOutlet weak var rejectButton: MyButton!

//Labels
@IBOutlet weak var planLabel: UILabel!
@IBOutlet weak var actualLabel: UILabel!
@IBOutlet weak var rejectsLabel: UILabel!
@IBOutlet weak var effLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    menuButton.isEnabled = true
    boxButton.isEnabled = true
    rejectButton.isEnabled = true
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    planLabel.text = "\(av.target)"
    actualLabel.text = "\(av.quantity)"
}

@IBAction func menuButtonTapped(_ sender: MyButton) {
    self.dismiss(animated: true, completion: nil)
}

@IBAction func boxButtonTapped(_ sender: MyButton) {
    addQuantity()
}

@IBAction func rejectsButtonTapped(_ sender: MyButton) {

}

//FUNC
func addQuantity() {
    av.quantity = (av.quantity + 1)
    actualLabel.text = "\(av.quantity)"
    print(av.quantity)
}
}

每次我关闭 segue 时如何保存 var,如果我回到这个 VC,如何加载最后一个数字?

【问题讨论】:

  • 您不能将 viewWillDisappear 中的 ActualValues 属性设置为 0 吗?或者更确切地说是 viewDidDisappear developer.apple.com/documentation/uikit/uiviewcontroller/…
  • 没有。例如,我添加了 10 个盒子。然后我解雇了 VC,并在应用程序中做其他事情。 2 分钟后回到 VC 并想再添加 5 个盒装。所以当我回来时,我想在我的Label中看到10,并添加5。当我下次返回时,我想看到15,并添加更多......但是现在每次打开VC时,av.quantity和label为 0。
  • 啊,我明白了。那么你有2个选择。您可以将其保存在 nsuserdefaults 中,就像您在 viewWillDisappear 中尝试的那样(例如 - stackoverflow.com/questions/31203241/…),或者将其保存在您的模型中。问题是,模型需要持久化,你在哪里创建它?
  • 创建一个静态变量并为其分配变量值..然后您可以从任何地方访问该值..或者您可以使用单例模式

标签: ios swift variables uiviewcontroller


【解决方案1】:

您可以使用 UserDefaults 来保存和加载数据。这是一个 Int 的示例:

UserDefaults.standard.set(3, forKey: "myKeyName")

要加载值,请使用类似的方法。但是,请注意类型是在函数调用中指定的。

UserDefaults.standard.integer(forKey: "myKeyName")

我还建议使用结构来存储键,因为这提供了额外的类型安全层。

struct UserDefaultKey {
    static let myInt = "myKeyName"
}

如果你使用segue,你可以使用下面的方法在segue发生之前处理任何数据:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
    // Save your data here
    UserDefaults.standard.set(3, forKey: UserDefaultKey.myInt)
}

【讨论】:

    【解决方案2】:

    我也会考虑使用单例类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多