Предупреждение: -Доступные контроллеры просмотра на отдельных контроллерах просмотра не рекомендуется

В моем приложении я использую контроллер навигации. Позже в некоторых случаях я использую 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];