UILabel (как выход) остается нулевым при доступе к нему с другого контроллера (всплывающее окно) - PullRequest
0 голосов
/ 24 декабря 2018

Есть 2 контроллера. это то, как выглядит пользовательский интерфейс это то, как я создаю всплывающее окно, т.е. с помощью segue

HomeViewController: имеет метку и кнопку.После нажатия на эту кнопку с именем -> «Добавить действие» -> открывается всплывающее окно.

PopupViewController: это всплывающее окно, в котором пользователь может ввести ввод и нажать «Сохранить».во всплывающем окне есть текстовое поле.Пользователь заполняет поле и нажимает кнопку Сохранить.при сохранении -> для этого PopupViewController вызывается IBAction, в котором есть функция dismiss () для закрытия всплывающего окна.и блок завершения внутри функции dismiss - это то место, где я пытаюсь создать экземпляр HomeViewController для обновления меток.(Примечание: PopupViewController создается с помощью segue, путем выбора в текущем контексте)

, но при этом я вижу, что все IBOutlets внутри HomeViewController равны нулю при попытке сохранить из всплывающего окна, поэтому я невозможность обновления ярлыков.

То, что я пробовал: я проверил другие вопросы и ответы в Интернете и проверил ниже: 1. Я проверил соединение метки с раскадровкой.это правильно.2. Я использовал синтаксис instantiateViewController, чтобы правильно создать экземпляр HomeViewController.но проблема остается.

HomeViewController

var actionNames = [String]()
var actionDescriptions = [String]()
@IBOutlet weak var firstActionLabel: UILabel!

func updateViewWithNewAction() {
    print("updating views started")
    if firstActionLabel != nil {
        if actionNames.count > 0 {
            firstActionLabel.text = actionNames[0]
        } else {
            print("no actions in the array")
        }
    } else {
        print("firstActionLabel is nil")
    }
    print("updating views completed")
}

func addActions(actionName: String, actionDescription: String) {
    actionNames.append(actionName)
    actionDescriptions.append(actionDescription)
    print("actions added")
}

PopupViewController

@IBOutlet weak var actionTitle: UITextField!
@IBOutlet weak var actionDescriptionTextView: UITextView!
@IBAction func createAction(_ sender: Any) {
    //getting action values from user
    actionName = actionTitle.text!
    actionDescription = actionDescriptionTextView.text!

    dismiss(animated: true, completion: {
        print("completion block started ---")
        let homeVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController

        homeVC.addActions(actionName: self.actionName, actionDescription: self.actionDescription)
        homeVC.updateViewWithNewAction()
        print("completion block ended ---")
    })
}

Ожидаемый результат: при createAction () PopupViewController метка внутри HomeViewController должна быть обновлена ​​с помощьюновое значение.Фактический результат: firstActionLabel - ноль, во время homeVC.updateViewWithNewAction ()

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

В основном я думаю, что вы хотите что-то вроде этого:

добавить в HomeViewController

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let popupViewController = segue.destination as? PopupViewController {
        popupViewController.callback = self.addActions
    }
}

И в PopupViewController добавить

var callback: ((String, String) -> Void)?

Затем в PopupViewController изменить

@IBAction func createAction(_ sender: Any) {
    //getting action values from user
    actionName = actionTitle.text!
    actionDescription = actionDescriptionTextView.text!

    dismiss(animated: true, completion: {
        callback?(self.actionName, self.actionDescription)
    })
}
0 голосов
/ 24 декабря 2018

Сделайте это так

class HomeViewController: UIViewcontroller {

    func viewDidLoad() {
        super.viewDidLoad()
        updateViewWithNewAction() 
    }

Проблема в том, что до viewDidLoad ни один из вас IBOutlet не будет инициализирован.Они должны инициализироваться через раскадровку.Вы не можете получить какую-либо ссылку до viewDidLoad.

. Если вы не хотите звонить updateViewWithNewAction() каждый раз, то добавьте флаг Bool, чтобы решить, звонить или не звонить updateViewWithNewAction().При необходимости установите флаг Bool в PopUpViewController или в любом другом месте.

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