Есть ли альтернатива ViewDidLoad?Любое другое место для написания кода, который должен быть активирован, когда загружается viewController? - PullRequest
0 голосов
/ 10 октября 2018

У меня есть viewController, который содержит три текстовых поля.Каждое текстовое поле связано с меткой и использует NSUser Default, поэтому, когда пользователь пишет что-то в текстовом поле, текст сохраняется с помощью клавиши - и отображается в назначенной ему метке.Это отлично работает.

Два из трех текстовых полей предназначены для пользователя, чтобы написать «вопрос» и «дополнительный идентификатор».В случае, если пользователь не знает, что в них писать, в верхней части экрана есть две кнопки, ведущие к двум различным tableViewControllers - каждая из которых содержит табличные представления с элементами / параметрами, которые пользователь может выбрать.Я реализовал последовательность для каждого из них, поэтому, когда пользователь нажимает tableViewCell, текст в этой ячейке передается в правое текстовое поле в viewController1 - и теперь пользователь может нажать сохранить и сохранить этот текст в NSUser Defaultи пусть это будет показано в назначенном ярлыке.

Проблема в том, что эти сегменты, конечно, используют ViewDidLoad, чтобы показать переданный текст из вдохновляющих таблиц ViewS.Это означает, что когда вы вводите второй tableViewController с вдохновением после сохранения, вы выбираете «вопрос» из первого, а затем - из-за метода viewDidLoad - все текстовые поля и метки снова очищаются, и отображается только то, что вы только что передали туда... Итак:

Могу ли я использовать другой метод, кроме viewDidLoad, для передачи данных в ViewController1?

Или я могу добавить некоторый код в метод viewDidLoad, чтобы он останавливался? "сбросить все метки и текстовые поля каждый раз, когда вы вводите viewController?

Или мне нужно все об этом по-другому?

Надеюсь, все это имеет смысл - извините задлинное объяснение!: D

Вот соответствующий код из viewController1:

var chosenQuestion:String = ""
var chosenIdentifier:String = ""

override func viewDidLoad() {
    super.viewDidLoad()
DiaryQuestionTextField.text = chosenQuestion
RandomIdentifierTextField.text = chosenIdentifier
}


@IBAction func WriteDiaryName() {

    let title = "You have now chosen you diary's name. \n \n Do you wish to save this name and continue? \n \n You can always change all the details."
    let alert =  UIAlertController(title: title, message: nil, preferredStyle: .alert)

    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))

    alert.addAction(UIAlertAction(title: "Save", style: .default, handler: { action in
        self.defaults.setValue(self.DiaryNameTextField.text, forKey: "DiaryNameKey")
        let NewDiaryName = self.defaults.string(forKey: "DiaryNameKey")
        self.DiaryNameLabel.text = NewDiaryName

    }))
        present(alert, animated: true, completion: nil)
    }

И, конечно, есть два аналогичных метода для «WriteQuestion» и «WriteExtraIdentifier».

А вот соответствующий код от одного из двух tableViewControllers с «вдохновением»:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.destination is UpdatingIdentifiers {
        let vc = segue.destination as? UpdatingIdentifiers
        let selectedRowIndex = self.tableView.indexPathForSelectedRow
        let cell = self.tableView.cellForRow(at: selectedRowIndex!)
        let label = cell?.viewWithTag(420) as! UILabel
        vc?.chosenQuestion = label.text!
    }
}

Спасибо!

enter image description here

enter image description here

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Просто, вам просто нужно заново инициализировать «selectedQuestion» и «selectedIdentifier» со значениями из UserDefaults в viewDidLoad, и вы готовы к работе.

0 голосов
/ 10 октября 2018

Для этого сценария можно просто использовать подход closure.

  1. Создать переменную closure в ViewController2.
  2. Установитьзначение этого closure всякий раз, когда вы представляете ViewController2 из ViewController1.
  3. . Вызывайте closure всякий раз, когда вы выбираете строку в tableView из ViewController2 и передаете выбранное значение в closure.
  4. Обновляйте chosenQuestion всякий раз, когда вы получаете новое значение от closure, используя которое, в свою очередь, обновляет значение textField's, используя property observer.

Пример кода:

class ViewController1: UIViewController
{
    @IBOutlet weak var DiaryQuestionTextField: UITextField!

    var chosenQuestion = "" {
        didSet{
            //Textfield will be updated everytime a new value is set in chosenQuestion variable
            self.DiaryQuestionTextField.text = self.chosenQuestion
        }
    }

    @IBAction func showInspirationVC(_ sender: UIButton)
    {
        let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController2") as! ViewController2
        controller.handler = {[weak self](data) in
            self?.chosenQuestion = data
        }
        self.present(controller, animated: true, completion: nil)
    }
}

class ViewController2: UIViewController, UITableViewDelegate, UITableViewDataSource
{
    var handler: ((String)->())?
    var data = ["Question-1", "Question-2", "Question-3", "Question-4", "Question-5"]

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return self.data.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = self.data[indexPath.row]
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
    {
        self.dismiss(animated: true) {
            self.handler?(self.data[indexPath.row])
        }
    }
}

Раскадровка:

enter image description here

Попробуйте реализовать простойсначала используйте вариант.И вам не нужны сегменты в этом подходе, так как вы представляете контроллер программно.

Дайте мне знать в случае любой проблемы.

...