Представить контроллер представления сразу после закрытия контроллера представления без анимации

У меня на экране отображается UIImagePickerController. Когда я выбираю фотографию, мне нужно отклонить PickerController, а затем сразу же представить другую PhotoEditController. Вот мой код

picker.dismissViewControllerAnimated(false, completion: {
    self.presentViewController(editPhotoVC, animated: false, completion: nil)
})

Между закрытием старого VC и представлением нового VC происходит вспышка 0,1 с, поэтому отображается PresentingViewController (self). Как мне избежать этого в элегантном решении, не взламывая его? Спасибо


person imObjCSwifting    schedule 25.09.2015    source источник
comment
Поскольку вы ничего не анимируете, почему бы просто не представить контроллер представления, не закрывая предыдущий? If you present several view controllers in succession, thus building a stack of presented view controllers, calling this method on a view controller lower in the stack dismisses its immediate child view controller and all view controllers above that child on the stack. When this happens, only the top-most view is dismissed in an animated fashion; any intermediate view controllers are simply removed from the stack.   -  person LLooggaann    schedule 26.09.2015
comment
Как? Эппл не разрешает   -  person imObjCSwifting    schedule 26.09.2015
comment
Извините, я говорю, что ваш новый контроллер представления присутствует на уже представленном контроллере представления (сборщик). Затем, когда вы хотите отклонить их все, отклоните от исходного контроллера представления, который представил первый.   -  person LLooggaann    schedule 26.09.2015
comment
правильно ли picker.dismissViewControllerAnimated? разве это не должно быть просто rejectViewControllerAnimated ?   -  person HMHero    schedule 26.09.2015
comment
@LLooggaann Я понимаю, что вы имели в виду. Собственно это я и реализовал. У меня есть обратный вызов делегата из editPhotoVC, реализованный для себя, чтобы одновременно закрыть оба контроллера представления. Вы должны написать ответ, и я отмечу как ответивший.   -  person imObjCSwifting    schedule 26.09.2015


Ответы (3)


Стандартный способ реализации — закрыть первый контроллер представления (VC) с анимацией и представить второй VC с анимацией.

Однако, в зависимости от вашей иерархии представлений, вы также можете сначала загрузить второй VC, а затем представить первый VC поверх него. При этом простое закрытие первого VC без анимации должно отображаться под вторым VC без задержки.

Третий подход, как предложил LLooggaann, не отклоняет первый VC и просто представляет второй VC. После этого отключите всю иерархию контроллера представления одним махом.

person Abhinav    schedule 26.09.2015

Вы можете создать экземпляр экземпляра PhotoEditController, а затем сделать что-то вроде этого:

instance.willMoveToParentViewController(controllerThatPresentsPicker)
controllerThatPresentsPicker.addChildViewController(instance)
controllerThatPresentsPicker.view.insertSubview(instance.view, belowSubview: picker.view)
instance.didMoveToParentViewController(controllerThatPresentsPicker)

Хотя это немного похоже на взлом

person user1232690    schedule 25.09.2015

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

person Lukas    schedule 25.09.2015