Подтвердить что ты не робот

Какая программная противоположность showViewController: отправитель:

Я пишу только приложение iOS 8, и я использую новые адаптивные презентации, используя комбинацию "Show" и "Show Detail" segue и методы showViewController:sender: и showDetailViewController:sender:.

Мой вопрос в том, что является программным способом вернуться после вызова showViewController:sender:? Способ отображения контроллера просмотра зависит от его родительского контекста. Например. в UINavigationController showViewController:sender: выталкивает новый контроллер в стек навигации, но если в графике контроллера просмотра нет контейнера UIKit, тогда showViewController:sender: заканчивает выполнение презентации.

Учитывая, что я мог написать свой собственный произвольный контроллер контейнера, кажется невозможным проверить

if (self.navigationController) {
    [self.navigationController popViewControllerAnimated:YES];
}
else if (self.presentingViewController){
...
else if ([self.parentViewController isKindOfClass:[CrazyCustomContainer class]]){
    [self.parentViewController someWackyUnwindMethod];
}
...

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

4b9b3361

Ответ 1

Существует глава о том, как showViewController:sender: и showDetailViewController:sender: работают в Программирование iOS 8: погружение глубоко в представления, контроллеры представлений и рамки.

При вызове этих методов они вызывают targetViewControllerForAction:sender: для себя и вызывают этот метод для возвращаемого объекта. Целевой объект может затем соответствующим образом отобразить контроллер вида. Например, контроллер навигации выталкивает контроллер представления в свой стек навигации.

Итак, вы можете создать общий метод dismissVC: и переопределить его в разных подклассах UIViewController.

extension UIViewController {
    func dismissVC(sender:AnyObject?) {
        if let presentingVC = targetViewControllerForAction("dismissVC", withSender: sender) as? UIViewController {
            presentingVC.dismissVC(self)
        }
    }
}

extension UINavigationController {
    override func dismissVC(sender: AnyObject?) {
        popViewControllerAnimated(true)
    }
}

extension CrazyCustomContainer {
    override func dismissVC(sender: AnyObject?) {
        someWackyUnwindMethod()
    }
}

Таким образом, когда вы вызываете метод dismissVC:, если вы всегда правильно отклоняете контроллер вида в зависимости от контекста.

Ответ 2

Вот трюк, который я использовал до появления showViewController, который может помочь.

if let nav = navigationController {
    // We have a navigation controller so we'll have a back button
}
else {
    // no navigation controller, need a cancel button
    // ... Add Cancel Button
}

В основном вы проверяете, где вы находитесь. Затем после этого вы можете поместить любой код сохранения в viewDidDisappear или что-то подобное, чтобы он работал для обоих. Другой вариант - проверить presentationViewController, но это не всегда гарантирует модальное представление.