Представить несколько контроллеров модального просмотра?
обновление:
Я снова столкнулся с этой проблемой и нашел другой путь. Если презентационный контроллер не встроен в контроллер навигации, он будет скрыт, если представленный контроллер не будет полноэкранным и станет черным. Метод setModalPresentationStyle: UIModalPresentationCurrentContext может применяться только к контроллеру навигации. Поэтому внедряйте контроллер представления в UINavigationController, установите для него UIModalPresentationCurrentContext и представите новый контроллер - вы получите диалоговый контроллер.
Я представляю контроллер поиска, у него есть tableView, который нажимает на подробный контроллер стека.
Подробный контроллер может представлять контроллер представления с сообщением, он состоит из небольшого UIView и полупрозрачного фона.
Проблема: при представлении последнего контроллера представлений все контрольные контроллеры под ним становятся скрытыми, а контроллер, который отображает контроллер поиска, становится видимым.
Вот что я делаю:
SearchViewController *viewController = [[SearchViewController alloc] initWithNibName:@"SearchViewController" bundle:nil];
viewController.data = dataArray;
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
[self.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];
[self.navigationController presentViewController:navigationController animated:YES completion:nil];
чем таблица подталкивает подробный вид:
DetailViewController *viewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
[viewController setHidesBottomBarWhenPushed:YES];
viewController.dataItem = [data objectAtIndex:(NSUInteger) [indexPath row]];
[self.navigationController pushViewController:viewController animated:YES];
и окно представления подробных представлений:
MessageController *controller = [[MessageController alloc] initWithNibName:@"MessageController" bundle:nil];
controller.message = message;
[self presentViewController:controller animated:YES completion:nil];
Когда он отклоняется, все контроллеры под ним становятся видимыми.
обновление:
все, что я хотел, - это представить контроллер вида, который будет иметь uitableview. Из этой таблицы, чтобы показать подробное представление, которое сможет отображать окно сообщения. Поле сообщения должно быть другим контроллером представления. И когда отображается окно сообщения, все два предыдущих контроллера исчезают. это проблема.
Ответы
Ответ 1
Тривиальный способ добиться этого - просто создать ВК Вы хотите представить модально и представить один за другим. К сожалению, это не сработает. То, что вы получаете, это только первый ВК представлен, все остальные просто никуда не денутся. UIKit просто не будет сотрудничать с тобой здесь.
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.view.layer renderInContext:context];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Ответ 2
В некоторых ситуациях вы можете иметь каждый представленный в режиме просмотра контроллер представления следующий.
let window = UIApplication.sharedApplication().keyWindow!
if let modalVC = window.rootViewController?.presentedViewController {
modalVC.presentViewController(vc, animated: true, completion: nil)
} else {
window.rootViewController!.presentViewController(vc, animated: true, completion: nil)
}
Ответ 3
Отключить все контроллеры представления выше представленного контроллера представления.
Документация Apple:
Если вы представляете несколько контроллеров представления подряд, тем самым создавая стек представленных контроллеров представления, вызов этого метода для контроллера представления, расположенного ниже в стеке, отклоняет его непосредственный дочерний контроллер представления и все контроллеры представления выше этого дочернего элемента в стеке. Когда это происходит, только самый верхний вид отклоняется в анимационном режиме; любые промежуточные контроллеры представления просто удаляются из стека. Самое верхнее представление отклоняется, используя его модальный стиль перехода, который может отличаться от стилей, используемых другими контроллерами представления ниже в стеке.
Уволить два модальных контроллера вида.
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:NULL];
https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#jumpTo_51
Ответ 4
Этот ответ может показаться немного нетрадиционным, но он работает. Это позволяет вам "открывать несколько модалов", но показывать только по одному. Ключ состоит в том, чтобы иметь только один модальный, но использовать Контроллер панели вкладок для переключения между View Controller s.
![несколько модалов]()
- Проведите свой модальный переход от синего (представления) Просмотр контроллера к модальному контейнеру (который является обычным View Controller)
- Модальный контейнер содержит только Container View, единственная цель которого - встраивание панели управления таблицами.
- Вставить Панель управления вкладками внутри Контейнеp >
- Каждая вкладка может быть отдельным View Controller, представляющим "несколько модалов"
- Установите Панель управления вкладками панель вкладок на скрыто
- Переключение между модалами с помощью
tabBarController?.selectedIndex = 1
- Закройте modal обычно с помощью
dismissViewControllerAnimated(true, completion: nil)
Он будет выглядеть примерно так:
![введите описание изображения здесь]()
Ответ 5
Установите правильный modalPresentationStyle
как для navigationController
, так и для viewController
.
self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
vcToPresent.modalPresentationStyle = UIModalPresentationFormSheet;
vcToPresent.preferredContentSize = CGSizeMake(650, 450);
[self presentViewController:vcToPresent animated:YES completion:^{
self.navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
}];`
Ответ 6
Я нашел решение: предоставьте собственную анимацию:
let transition: CATransition = CATransition()
transition.duration = 0.5
transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition.type = kCATransitionReveal
transition.subtype = kCATransitionFromBottom
self.view.window!.layer.add(transition, forKey: nil)
self.presentingViewController?.presentingViewController?.dismiss(animated: false, completion: nil)