Я пытаюсь загрузить один из двух разных строковых массивов в 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 :) никогда не вызывается в булевом тесте условия.