Swift: когда выполняется блок завершения представления «Отклонить»?

#ios #iphone #swift

#iOS #iPhone #swift

Вопрос:

Когда выполняется блок завершения представления «Отклонить»? Это после или до того, как пользователь увидит, что представление отклонено?

У меня есть этот код, чтобы создать тост с сообщением внутри блока завершения, но я никогда не вижу тост после того, как это представление отклонено.

        self.dismiss(animated: true, completion: {
       self.view.makeToast(message: "Employee has been assigned successfully.", duration: 2.0, position: HRToastPositionCenter as AnyObject, title: "Succeeded!")
})
  

Я хочу, чтобы пользователь мог видеть всплывающее окно, когда представление полностью отклоняется?

Как мне это сделать?

Комментарии:

1. Вы можете делегировать событие от представленного контроллера родительскому и обрабатывать его там (dismiss и makeToast)

Ответ №1:

Вы можете делегировать событие из представленного контроллера родительскому и обрабатывать его там.

В EmployeePickerViewController (или как там называется ваш модальный контроллер):

 @protocol EmployeePickerDelegate {
    func employeeAssigned()
}

class EmployeePickerViewController {
    weak delegate: EmployeePickerDelegate!
}
  

Когда назначение сотрудника завершено, просто вызовите метод делегата:

 delegate?.employeeAssigned()
  

В MainViewController при модальном представлении:

 employeePicker.delegate = self
present(employeePicker, animated: true, completion: nil)
  

В MainViewController ниже:

 extension MainViewController: EmployeePickerDelegate {
   func employeeAssigned {
       dismiss(animated: true, completion: {
            self.view.makeToast(message: "Employee has been assigned successfully.", duration: 2.0, position: HRToastPositionCenter as AnyObject, title: "Succeeded!")
       })
   }
}
  

Ответ №2:

Для UIViewController.dismiss(анимированный: завершение:)

Обработчик завершения вызывается после вызова метода viewDidDisappear(_:) на представленном контроллере представления.

Источник

Для UIViewController.present(_:animated:завершение:)

Обработчик завершения вызывается после вызова метода viewDidAppear(_:) на представленном контроллере представления.

Источник.


Если вы не знаете, когда это произойдет, это порядок загрузки, появления и исчезновения методов UIViewController

  1. viewDidLoad

обычно мы инициализируем объекты данных и элементы управления. Это создаст всю необходимую память для всех элементов управления / объектов данных для этого представления. т.Е. В приведенном выше случае anotherView и btnView будут сохранять одни и те же адреса памяти в течение всего жизненного цикла.

  1. Появится viewWillAppear

Вызывается перед добавлением представления в иерархию представлений Windows. Таким образом, он идеально подходит для обновления данных viewcontroller.

  1. viewDidAppear

Вызывается после добавления представления в иерархию представлений Windows.

  1. viewWillDisappear

Вызывается перед удалением представления из иерархии представлений Windows.

  1. viewDidDisappear

Вызывается после удаления представления из иерархии представлений Windows.

Источник

Ответ №3:

Вы вызываете dismiss для self, поэтому каждая ссылка на это будет освобождена. self.view я думаю, ваш больше не существует.

Комментарии:

1. self.view все еще существует, потому что он сильно захвачен

2. попробуйте добавить точку останова в строке self.view.makeToast() и проверить объекты в это время

Ответ №4:

Блок завершения выполняется после того, как контроллер представления был отклонен. Это означает, что ваше представление больше не отображается на экране. Я думаю, вы хотите отобразить тост внутри этого представления, что невозможно, поскольку оно находится за пределами экрана.

Ответ №5:

Тост будет показан внутри вашего отклоненного представления. Поскольку представление исчезло, вы не увидите его тост. Возможно, вы захотите показать всплывающее окно на следующем экране, которое появляется после просмотра «Отклонить».

Комментарии:

1. Спасибо, но как отобразить всплывающее окно из текущего представления в следующее представление

2. Как вы представили представление, которое вы сейчас отклоняете?

Ответ №6:

Может быть, было бы проще показать всплывающее окно в окне вместо определенного представления?

    UIApplication.shared.keyWindow?.makeToast(message: "Employee has been assigned successfully.", duration: 2.0, position: HRToastPositionCenter as AnyObject, title: "Succeeded!")