Инициировать события, когда ViewController покрыт представленным ViewController
Я хотел бы обработать код, когда ViewController больше не виден из-за представления нового ViewController.
Я не могу использовать ViewWillDisappear и т. Д., Поскольку контроллер технически никогда не удаляется из стека - вы просто не можете его увидеть.
Какой процесс я могу использовать для запуска кода, когда контроллер больше не виден (т. Е. Самый верхний) и когда он снова становится видимым?
РЕДАКТИРОВАТЬ: Кажется, некоторая путаница здесь - не уверен, почему. У меня есть viewcontroller. Я использую следующий код для представления другого контроллера
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let navController = storyboard.instantiateViewControllerWithIdentifier("NavController") as! UINavigationController
let thisController = navController.viewControllers[0] as! MyController
self.presentViewController(navController, animated: true, completion: nil)
Этот контроллер не вызывает viewWillDisappear на предыдущем контроллере, так как предыдущий вид не удаляется - просто скрывается.
Мне нужно обрабатывать код, когда это представление скрыто (т.е. не видно), и, что более важно, обрабатывать код, когда он снова становится видимым.
3 ответа
При представлении UIViewController
если стиль презентации был установлен на UIModalPresentationOverCurrentContext
это не называется viewWillDisappear
и связанные методы, поскольку представление никогда не исчезает и не скрывается.
Простой тест, чтобы проверить, в этом ли дело, состоит в том, чтобы установить используемый NavController, чтобы иметь чистый фоновый цвет. Если вы сделаете это и представите NavController, вы все равно сможете увидеть первый UIViewController под вашим содержимым NavController. Тогда вы используете UIModalPresentationOverCurrentContext
и именно поэтому viewDidDisappear
не называется.
Взгляните на ответ, на который ссылается Сергей Катранюк ( /questions/43813027/prosmotr-zhiznennogo-tsikla-kontrollera-v-uimodalpresentationovercurrentcontext/43813032#43813032).
РЕДАКТИРОВАТЬ: это в Swift 3, вы можете настроить свой метод соответствующим образом, если вы используете более старую версию Swift
Если вы не сможете понять, почему viewDidAppear
а также viewDidDisappear
не называются, вот обходной путь
protocol MyControllerDelegate {
func myControllerWillDismiss()
}
class MyController: UIViewController {
var delegate: MyControllerDelegate?
// your controller logic here
func dismiss() { // call this method when you want to dismiss your view controller
// inform delegate on dismiss that you're about to dismiss
delegate?.myControllerWillDismiss()
dismiss(animated: true, completion: nil)
}
}
class PresentingController: UIViewController, MyControllerDelegate {
func functionInWhichYouPresentMyController() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let navController = storyboard.instantiateViewController(withIdentifier: "NavController") as! UINavigationController
let thisController = navController.viewControllers[0] as! MyController
thisController.delegate = self // assign self as delegate
present(navController, animated: true, completion: {
// place your code that you want executed when it disappears here
})
}
func myControllerWillDismiss() {
// this method will be called now when MyController will dismiss
// place your code that you want executed when it re-appears here
}
}
Во-первых, спасибо Сергею за его помощь в работе над этим.
Чтобы уточнить, оба моих потенциальных представленных контроллера были настроены на полноэкранный стиль представления в раскадровке, однако один из них был настроен на Custom с помощью вставленного кода, связанного с презентацией. Я не могу найти ошибку с другим.
Тем не менее, если я включу стиль представления в полноэкранном режиме как часть процесса представления, тогда все в порядке.
Надеюсь, мой разочаровывающий день может помочь спасти кого-то другого - всегда пытайтесь понять последствия и процессы, связанные с вставленными фрагментами.