SWIFT - Сброс переменной при возврате из второго ViewController - PullRequest
0 голосов
/ 13 сентября 2018

Я искал часы здесь и в Google, но так и не нашел ответа. Все указывает на передачу переменной от VC к другому, но не на то, как поддерживать переменные в VC.

Я могу передавать переменные из виртуального контейнера в другой, используя несколько методов, таких как синглтон, но когда я перехожу из второго виртуального контейнера в основной виртуальный канал, я все еще сталкиваюсь с той же проблемой.

Например, у вас есть основной VC, который имеет метку и 2 кнопки. Когда вы нажимаете одну из кнопок, текст метки меняется, а затем вы нажимаете вторую кнопку, чтобы перейти ко второму ВК. Затем, когда вы возвращаетесь к первому VC, возникает проблема: метка сбрасывается в исходный текст «метка». Почему?

Я пытался использовать глобальную переменную в отдельном файле swift. Я сказал себе хорошо, что значение хранится в другом файле swift, нет причины, по которой значение метки сбрасывается ... но хорошо, что оно все еще сбрасывается.

Большое спасибо.

Пример в видео: https://youtu.be/Wx5blkQqU7E

Очень простой пример:

varTest.swift

import Foundation

var myVar2: String!

Main ViewController

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

    }
}

Второй ViewController

import UIKit

class ViewController2: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func btnPrint(_ sender: UIButton) {

        performSegue(withIdentifier: "returnForm", sender: self)
    }
}

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я думаю, что проблема в том, что вы не возвращаетесь из ViewController2 в ViewController, а толкаете новый экземпляр ViewController, который отображает новую UILabel со значением по умолчанию. Вы можете создать переход от второго контроллера представления к первому контроллеру представления или вызвать dismiss (animated: complete :) на втором контроллере представления. Эта статья может помочь вам создать сеанс раскрутки.

0 голосов
/ 14 сентября 2018

Когда вы выполняете «executeSegue», значения в классе 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")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...