ViewDidAppear не вызывается автоматически

У меня есть HomeViewController, который открывает WelcomeViewController с помощью перехода и имеет тип Sheet.

В WelcomeViewController Пользователь вводит информацию, а затем закрывает (удаляет) ее. После закрытия WelcomeViewController я хочу обновить HomeViewController, изменив значение String в TextField.

Проблема в том, что ViewDidAppear в HomeViewController не вызывается после отклонения WelcomeViewController. У меня не было этой проблемы раньше при разработке для iOS.

Как я могу это исправить? Я пытался вызвать его вручную, но возникли проблемы, потому что мой IBOutlets был установлен на ноль, и я не мог изменить текст в своем TextField.

Это код, который вызывает переход:

self.performSegue(withIdentifier: "welcome", sender: self)

это мой viewDidAppear в HomeViewController:

override func viewDidAppear() {
   super.viewDidAppear()
   if (CoreDataAccess().countUsers() == 0) {
       self.performSegue(withIdentifier: "welcome", sender: self)
   } else {
       //continue execution..
   }
}

В WelcomeViewController я отклоняю ViewController, используя этот код

dismiss(self)

person Alexander Maslew    schedule 07.11.2018    source источник
comment
Пожалуйста, проверьте этот поток stackoverflow.com/questions/29271880/   -  person Natarajan    schedule 07.11.2018
comment
Опубликуйте код, который создает ваш контроллер представления/вызывает переход, а также опубликуйте свой метод viewDidAppear. (вы никогда не должны вызывать этот метод. Это то, что делает система.)   -  person Duncan C    schedule 07.11.2018
comment
@DuncanC Я разместил код   -  person Alexander Maslew    schedule 07.11.2018
comment
Используйте делегат. viewDidAppear не будет вызываться в вашем случае   -  person ullstrm    schedule 07.11.2018
comment
Ты что-нибудь делаешь в prepare(for segue:)? Может быть, передать экземпляр HomeViewController? Кроме того, я никогда не использовал переход типа Sheet, но зачем создавать переход для раскрутки?   -  person dfd    schedule 07.11.2018
comment
Ваши выходы не должны быть нулевыми. как вы пытаетесь передать данные из welcomeViewController обратно на первый экран? вам нужно показать больше кода. твоя проблема не ясна   -  person Scriptable    schedule 07.11.2018
comment
@dfd нет, у меня нет подготовки (для перехода :)   -  person Alexander Maslew    schedule 07.11.2018
comment
@Scriptable Я использую CoreData для сохранения данных. А затем отобразить его в homeViewController   -  person Alexander Maslew    schedule 07.11.2018
comment
@Scriptable Я создал переход в своей раскадровке и вызвал его с идентификатором приветствия вручную из кода ... Другой код только сохраняет и загружает из CoreData и не имеет отношения к моей проблеме.   -  person Alexander Maslew    schedule 07.11.2018
comment
Я ждал других, более опытных, чем я, и ничего. Так. С моей точки зрения? Вы не дали нам достаточно, чтобы помочь. Мои вопросы? Хорошо... вы не видели необходимости в prepare(for: segue:)... почему? Этот стандартный способ передать исходный контроллер представления его целевому. Вы так и не ответили @ullstrm... почему бы не попробовать использовать делегата? Он работает очень хорошо, когда представляет другой контроллер представления из одного. Наконец, @Kevinosaurio помог? Или, по крайней мере, дать вам правильное направление? Теперь вам нужно предоставить что-то еще....   -  person dfd    schedule 07.11.2018
comment
Я только что нашел решение с помощью делегата. Как сказал @ullstrm, в моем случае viewDidAppear вызываться не будет. Используя делегат, мои текстовые поля больше не были равны нулю. Сейчас опубликую решение. Я не видел необходимости в подготовке, потому что я не передаю никаких данных своему второму ViewController.   -  person Alexander Maslew    schedule 08.11.2018


Ответы (2)


Вот как я решил это, используя delegate. Спасибо @ullstrm за предложение.

Сначала я добавил этот протокол в HomeViewController

protocol WelcomeDelegate {
    func insertData(_ name: String, birthday: Date)
}

Тогда это prepare(for segue:)

override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
    if let destinationViewController = segue.destinationController as? WelcomeViewController {
        destinationViewController.delegate = self
    }
}

И это расширение внизу (я знаю, что нельзя вызывать viewDidAppear вручную, но пока оно работает)

extension HomeViewController : WelcomeDelegate {
    func insertData(_ name: String, birthday: Date) {
        viewDidAppear()
    }
}

Затем в WelcomeViewController я добавил эту переменную

var delegate:WelcomeDelegate? = nil

И эта строка прямо перед dismiss(self)

self.delegate?.insertData(tfName.stringValue, birthday: dpAge.dateValue)
person Alexander Maslew    schedule 07.11.2018

Добавьте свой код в ViewWillAppear() вместо ViewDidAppear().

или вы вызываете метод в HomeViewController при отклонении WelcomeViewcontroller

dismiss(animated: true) {
   self.presentedViewController.myMethod()
}
person Raul Mantilla    schedule 07.11.2018
comment
Не работает, ViewWillAppear() также не вызывается после того, как я отключил свой второй ViewController. - person Alexander Maslew; 07.11.2018
comment
вызовите метод в HomeViewController при отклонении WelcomeViewcontroller reject(animated: true) { self.presentedViewController.myMethod() } сообщите мне.. - person Raul Mantilla; 07.11.2018
comment
Да, я могу вызвать метод, но это не поможет мне получить доступ к моему TextField. Без вызова ViewDidAppear мои IBOutlets установлены на ноль. - person Alexander Maslew; 07.11.2018