SWIFT - 从第二个 ViewController 返回时变量重置



我在这里和谷歌上搜索了几个小时,但仍然没有找到答案。一切都指向将变量从一个 VC 传递到另一个 VC,但不指向如何使变量在 VC 上保持活动状态。

我可以使用多种方法(例如单例)将变量从 VC 传递到另一个 VC,但是当我从第二个 VC 转到主 VC 时,我仍然面临同样的问题。

例如,您有一个带有标签和 2 个按钮的主 VC。单击其中一个按钮时,标签文本将更改,然后单击第二个按钮以转到第二个 VC。然后,当您返回到第一个VC时,问题出现了:标签重置为其初始文本"label"。为什么?

我尝试在单独的 swift 文件中使用全局变量。我对自己说,该值存储在另一个 swift 文件中,没有理由重置标签的值。但它仍在重置。

非常感谢。

视频中的示例:https://youtu.be/Wx5blkQqU7E

非常基本的例子:

varTest.swift

import Foundation
var myVar2: String!

主视图控制器

import UIKit
class ViewController: UIViewController {
@IBOutlet var mylabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func dsfg(_ sender: UIButton) {
performSegue(withIdentifier: "switchForm", sender: self)
}
@IBAction func changeLabeltext(_ sender: UIButton) {

myVar2 = "Good."
mylabel.text = myVar2
}
}

第二视图控制器

import UIKit
class ViewController2: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func btnPrint(_ sender: UIButton) {
performSegue(withIdentifier: "returnForm", sender: self)
}
}

我认为问题是您没有从ViewController2返回到ViewController,而是正在推送一个新的ViewController实例,该实例将显示具有默认值的新UILabel。您可以创建从第二个视图控制器到第一个视图控制器的展开 segue,也可以在第二个视图控制器上调用 dismiss(animated:completion:)。本文可以指导您创建一个放松的续集。

当你"执行Segue"时,ViewController类中的值被重置 - 不要使用 segue。

或者:你提到你试图在一个单独的 swift 文件中使用全局变量。请改用存储在客户端的临时文件。

使用这些 func 创建一个文件并写入它:

//This OVERWRITES already existing files!
func createFileinDocumentDirectory(filename: String){
let blank = ""
if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
let fileURL = dir.appendingPathComponent(filename)
do {
try blank.write(to: fileURL, atomically: false, encoding: .utf8)
}
catch let error as NSError {
print("Ooooops! Something went wrong: (error)")
}
}
}
func writeToFileInDocumentDirectory(filename: String, textToAdd: String){
do {
let dir: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last! as URL
let url = dir.appendingPathComponent(filename)
try textToAdd.appendLineToURL(fileURL: url as URL)
}
catch {
print("Could not write to file")
}
}

相关内容

  • 没有找到相关文章

最新更新