Булева переменная всегда ложна при передаче между классами через раскадровку - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь загрузить один из двух разных строковых массивов в viewController в зависимости от значения логической переменной.Логическое значение должно быть передано с помощью segue, который может быть вызван из 2 viewControllers, один устанавливает логическое значение на false, а другой true.

Я пытался использовать метод prepareForSegue (segue :) с executeSegue (withIdentifier):).Все ссылки и идентификаторы раскадровки настроены.Я также попытался встроить целевой viewController в navigationController и настроить код перехода так, чтобы он ссылался на navigationController.

import UIKit

class homeworkViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var useHomework = Bool()
    var homeworkWords = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        loadHomeworkWords()

        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .play, target: self, action: #selector(test))
    }

    func loadHomeworkWords() {
        if let defaults = UserDefaults(suiteName: "group.co.uk.tirnaelectronics.hyperpolyglot.todayview") {
            if var savedHomeWorkWords = defaults.object(forKey: "homeworkWords") as? [String] {
                print("savedLanguages array is: \(savedHomeWorkWords)")
                homeworkWords.removeAll()
                homeworkWords = savedHomeWorkWords
                savedHomeWorkWords.removeAll()
                print("savedHomeWorkWords after removeAll: \(savedHomeWorkWords)")
                print("loadHomeworkWords homeworkWords are: \(homeworkWords)")
            }
        }
    }

    func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "Test" {
            if let testVC = segue.destination as? TestViewController {
                testVC.useHomework = useHomework
            }
        }
    }

    @objc func test() {
        if homeworkWords.isEmpty == true {
            let ac = UIAlertController(title: "Add some homework!", message: nil, preferredStyle: .alert)
            let okAction = UIAlertAction(title: "OK", style: .default)
            ac.addAction(okAction)
            present(ac, animated: true)
        } else {
            useHomework = true
            self.performSegue(withIdentifier: "Test", sender: self)
        }
    }
}
import UIKit

class TestViewController: UIViewController, UITextFieldDelegate {

    var words: [String]!
    var useHomework = Bool()
    var homeworkWords = [String]()
    var chosenLanguage = String()
    let wordsString = "Words"

    override func viewDidLoad() {
        super.viewDidLoad()

        print("useHomework is: \(useHomework)")

        if useHomework == false {
            loadWords(fromWordsArray: "words")
        } else {
            loadWords(fromWordsArray: "homeworkWords")
        }

        print("words just before shuffle: \(words!)")
        words.shuffle()
        print("words just after shuffle: \(words!)")
    }

    func loadWords(fromWordsArray: String) {
        if let defaults = UserDefaults(suiteName: "group.co.uk.tirnaelectronics.hyperpolyglot.todayview") {
            if fromWordsArray == "words" {
                if var savedWords = defaults.object(forKey: "\(chosenLanguage)\(wordsString)") as? [String] {
                    print("chosen words in loadWords in TestViewcontroller are: \(savedWords)")
                    words = savedWords
                    savedWords.removeAll()

                }
            } else {
                if var savedWords = defaults.object(forKey: "homeworkWords") as? [String] {
                    print("savedWords array is: \(savedWords)")
                    words = savedWords
                    savedWords.removeAll()
                    print("homeworkWords in loadWords in TestViewcontroller are: \(savedWords)")
                }
            }
        }
    }
}

Консоль отладки всегда сообщает useHomework как false при переходе из любого класса.Когда я устанавливаю useHomework в значение true в инициализаторах класса testViewController, я получаю ожидаемый результат.

Массив homeworkWords содержит правильные строковые значения, которые добавляются в homeworkWords и сохраняются в userDefaults в другом (словах) viewController, который переходит кtestViewController.

homeworkWords никогда не загружается и не сохраняется в строковом массиве слов, поскольку loadWords (fromWordsArray :) никогда не вызывается в булевом тесте условия.

1 Ответ

0 голосов
/ 09 июня 2019

В TestViewController изменить объявление useHomework с

var useHomework = Bool()

на следующее:

var useHomework: Bool?

И сделатьвнесите соответствующие изменения в «useHomework», развернув его там, где он используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...