Предупреждение: -Доступные контроллеры просмотра на отдельных контроллерах просмотра не рекомендуется
В моем приложении я использую контроллер навигации. Позже в некоторых случаях я использую presentViewController
для отображения увеличенного изображения.
Также я не использую Раскадровка или нить.
Я получаю эту ошибку только в iOS 7. Он отлично работает в iOS 6 и ранее:
Представление контроллеров представлений на отдельных контроллерах просмотра рекомендуется
Ответы
Ответ 1
Одним из решений этого является то, что у вас есть childviewcontroller. Таким образом, вы просто представляете контроллер на своем родителе с помощью
[self.parentViewController presentViewController:viewController animated:YES completion:nil];
И для уклонения используйте тот же контроллер отклонения.
[self dismissViewControllerAnimated:YES completion:nil];
Это идеальное решение для меня.
Ответ 2
Чтобы избежать предупреждения в push-навигации, вы можете напрямую использовать:
[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];
И затем в вашем модульном контроллере просмотра, когда все будет готово, вы можете просто позвонить:
[self dismissViewControllerAnimated:YES completion:nil];
Ответ 3
Причина этого предупреждения заключается в том, что я представляю контроллер представления на небольшом представлении, который не является полноразмерным. Ниже приведен образ моего проекта. где нажимают на четыре варианта выше. Пользователь переходит к другому представлению childviewcontroller (он работает как tabViewcontroller). Но childviewcontroller содержит представление о небольшом размере. Поэтому, если мы представим представление из childviewcontroller, оно дает это предупреждение.
![master detail view]()
И чтобы этого избежать, вы можете представить представление родителя childviewcontroller
[self.parentViewController presentViewController:viewController animated:YES completion:nil];
Ответ 4
Подождите viewDidAppear()
:
Эта ошибка также может возникнуть, если вы пытаетесь представить контроллер представления до того, как вид действительно появился, например, представление вида в viewWillAppear()
или ранее.
Попробуйте представить другое представление после viewDidAppear()
или внутри него.
Ответ 5
В моем случае у меня есть представление sampleViewController
, добавленное как subview, затем пытается представить popover из представления sampleViewController
(здесь self
вместо экземпляра UIViewController
):
[self.view addSubview:sampleViewController.view];
Правильный путь должен быть ниже:
// make sure the vc has been added as a child view controller as well
[self addChildViewController:sampleViewController];
[self.view addSubview:sampleViewController.view];
[sampleViewController didMoveToParentViewController:self];
B.t.w., это также работает для случая, когда popover формирует ячейку tableview, вам просто нужно убедиться, что контроллер таблицы также добавлен как контроллер детского представления.
Ответ 6
Я думаю, что проблема в том, что у вас нет правильной иерархии контроллера. Установите rootviewcontroller приложения, а затем покажите новые представления, нажав или представив на них новые контроллеры представлений. Пусть каждый контроллер просмотра управляет своими представлениями. Только контроллеры контейнерных представлений, такие как tabbarviewcontroller, должны когда-либо добавлять другие представления контроллеров представлений в свои собственные представления. Прочтите руководство по программированию контроллеров представлений, чтобы узнать больше о том, как правильно использовать контроллеры представлений. https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/
Ответ 7
У меня почти такая же проблема. Причина заключалась в том, что я попытался представить "некоторый" контроллер на другом, и после завершения анимации я установил представленный контроллер как root. После этой операции все последующие контроллеры приводят меня к предупреждению: " Представление контроллеров представления на отдельных контроллерах просмотра не рекомендуется". И я решаю это предупреждение как раз настройки "некоторый" контроллер как root без какой-либо презентации в начале.
Удалено:
[[self rootController] presentViewController:controller animated:YES completion:^{
[self window].rootViewController = controller;
[[self window] makeKeyAndVisible];}];
Просто сделайте как root без какой-либо презентации:
[[self window] setRootViewController:controller];
Ответ 8
Swift 3
Для тех, кто наткнулся на это, вот быстрый ответ.
self.parent?.present(viewController, animated: true, completion: nil)
Ответ 9
Используйте [self.navigationController presentViewController:xxx animated:YES completion:nil]
в iOS 8.
Ответ 10
Попробуйте этот код
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:<your ViewController object>];
[self.view.window.rootViewController presentViewController:navigationController animated:YES completion:nil];
Ответ 11
Да, я также столкнулся с тем же предупреждающим сообщением при отображении контроллера оповещений, который был в другом представлении. Позже я избежал этого, представив контроллер предупреждений из родительского контроллера представления, как показано ниже:
[self.parentViewController presentViewController:alertController animated:YES completion:nil];
Ответ 12
вам нужно добавить контроллер вида, который представит новый контроллер в качестве дочернего элемента родительского контроллера представления.
Скажем, у вас есть yourMainViewController, затем вы добавляете новый контроллер с именем controllerA, а затем вы хотите представить новый контроллер с именем controllerB от контроллераA
вам нужно написать что-то вроде этого:
[self addChildViewController:controllerA]; //self is yourMainViewController
[self.view addsubView:controllerA.view];
и внутри контроллераA вы можете представить новый контроллер без предупреждений
[self presentViewController:controllerB animated:YES completion:nil]; //self is controllerA
Ответ 13
Попробуйте представить на TabBarController
, если это приложение на основе TabBarController
.
[self.tabBarController presentViewController:viewController animated:YES completion:nil];
Причиной может быть self
является дочерний элемент TabBarController
, и вы пытаетесь представить из ChildViewController
.
Ответ 14
Перед запуском убедитесь, что у вас есть контроллер корневого представления. Вы можете установить его в didFinishLaunchingWithOptions
.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[window setRootViewController:viewController];
}
Ответ 15
Множество причин для этого предупреждения. Мой - это потому, что у меня есть сеанс, связанный с ViewController с другим, который будет представлен модально. Но, ViewController, из которого я представляю, динамически генерируется с помощью PageViewController. Вот почему он отстранен от раскадровки. Из-за этого мое приложение не выйдет из строя; но я хотел бы отключить предупреждение.
Ответ 16
В Swift 4.1 и Xcode 9.4.1
Решение
DispatchQueue.main.async(execute: {
self.present(alert, animated: true)
})
Если написать так, я получаю ту же ошибку
let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
})
alert.addAction(defaultAction)
present(alert, animated: true, completion: nil)
Я получаю ту же ошибку
Presenting view controllers on detached view controllers is discouraged <MyAppName.ViewController: 0x7fa95560Z070>.
Полное решение -
let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
})
alert.addAction(defaultAction)
//Made Changes here
DispatchQueue.main.async(execute: {
self.present(alert, animated: true)
})
Ответ 17
Это зависит от того, хотите ли вы показать свое предупреждение или что-то подобное в любом месте вида UIViewController.
Вы можете использовать этот пример кода:
UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Example" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:nil];
[alert addAction:cancelAction];
[[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:alert animated:true completion:nil];
Ответ 18
Я достиг этой темы, где у меня есть пользовательская панель навигации, и я вызывал через нее AlertViewController.
Я должен был добавить это как ребенок к моему главному контроллеру представления. Тогда я могу позвонить и подарить его без предупреждения.
Вы должны добавить свой Zoomed Image View Controller
как дочерний элемент основного ViewController.
(например,
[self addChildViewController:ZoomedImageViewController];
Тогда вы сможете вызвать свой ZoomedImageViewController
[self presentViewController:ZoomedImageViewController];