【问题标题】:SWIFT - Variable resetting when back from second ViewControllerSWIFT - 从第二个 ViewController 返回时变量重置
【发布时间】:2018-09-13 20:43:44
【问题描述】:

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

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

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

我尝试在单独的 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)
    }
}

【问题讨论】:

  • 您是否可以在第一个视图控制器的viewWillAppear 方法中重置第一个视图控制器中标签的文本值?你能分享一些你的视图控制器的代码吗?
  • 完成@MohammedAbdullatif。如您所见,这是一个非常基本的测试项目。当我从第二个 VC 回来时,我试图弄清楚为什么标签会重新初始化到它的初始状态(文本)
  • @MohammedAbdullatif 我添加了一个视频,您可以在以下位置观看:youtu.be/Wx5blkQqU7E
  • 你要展开回到第一个VC吗?您的代码中没有任何内容表明这一点。编辑: Segue 只是一种(在情节提要中)将视图控制器“推送和弹出”到堆栈的视觉方式。从事情的声音 - 并且您的代码表明 - 您只是将 VC2 推到 VC1 之上,然后将 VC1 的 second 实例推入而不是从堆栈中“弹出”VC2。
  • 我认为问题在于你没有从ViewController2返回到ViewController,而是推送一个新的ViewController,它将显示一个新的UILabel及其默认值。您可以创建从第二个视图控制器到第一个视图控制器的展开转场,或者您可以在第二个视图控制器上调用 dismiss(animated:completion:)This article 可以指导你创建一个 unwind segue。

标签: swift uiviewcontroller segue


【解决方案1】:

我认为问题在于您没有从ViewController2 返回到ViewController,而是推送了一个新的ViewController 实例,它将显示一个带有默认值的新UILabel。您可以创建从第二个视图控制器到第一个视图控制器的展开转场,或者您可以在第二个视图控制器上调用dismiss(animated:completion:)。 This article 可以指导你创建一个 unwind segue。

【讨论】:

  • 这是正确答案。执行转场(除了展开转场)会创建视图控制器的新实例并显示该新实例。它不会包含其他实例独有的任何值。
【解决方案2】:

当您“执行Segue”时,ViewController 类中的值会被重置 - 不要使用 segue。

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

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

//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")
    }
}

【讨论】:

  • 好答案。你能举一个在 Storyboards 中做“放松”转场的例子吗?我认为这才是真正的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多