在 SWIFT 中关闭 segue 之前保存变量
Posted
技术标签:
【中文标题】在 SWIFT 中关闭 segue 之前保存变量【英文标题】:Save variable before dismiss segue in SWIFT 【发布时间】: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 中尝试的那样(例如 - ***.com/questions/31203241/…),或者将其保存在您的模型中。问题是,模型需要持久化,你在哪里创建它? 创建一个静态变量并为其分配变量值..然后您可以从任何地方访问该值..或者您可以使用单例模式 【参考方案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】:我也会考虑使用单例类。
【讨论】:
以上是关于在 SWIFT 中关闭 segue 之前保存变量的主要内容,如果未能解决你的问题,请参考以下文章