Инициировать события, когда 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 с помощью вставленного кода, связанного с презентацией. Я не могу найти ошибку с другим.

Тем не менее, если я включу стиль представления в полноэкранном режиме как часть процесса представления, тогда все в порядке.

Надеюсь, мой разочаровывающий день может помочь спасти кого-то другого - всегда пытайтесь понять последствия и процессы, связанные с вставленными фрагментами.

Другие вопросы по тегам