在 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 之前保存变量的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用程序在 swift 中关闭视图后冻结

在附加的视图控制器中关闭 Popover segue

从另一个 Popover 中关闭显示为 Popover segue 的 ViewController

在 Access 中是不是可以从全局函数中关闭变量?

如何在 Swift 中关闭 ViewController?

如何在 Swift 中关闭和完成处理程序后获取数据