#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
- viewDidLoad
обычно мы инициализируем объекты данных и элементы управления. Это создаст всю необходимую память для всех элементов управления / объектов данных для этого представления. т.Е. В приведенном выше случае anotherView и btnView будут сохранять одни и те же адреса памяти в течение всего жизненного цикла.
- Появится viewWillAppear
Вызывается перед добавлением представления в иерархию представлений Windows. Таким образом, он идеально подходит для обновления данных viewcontroller.
- viewDidAppear
Вызывается после добавления представления в иерархию представлений Windows.
- viewWillDisappear
Вызывается перед удалением представления из иерархии представлений Windows.
- 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!")