В моем приложении я использую навигационный контроллер. Позже в некотором представлении я использую presentViewController
для показа увеличенного изображения. Также я не использую раскадровку или перо.
Я получаю эту ошибку только в iOS 7. Он отлично работает в iOS 6 и более ранних версиях:
Представление контроллеров представления на независимых контроллерах представления не рекомендуется
Ответы:
Чтобы избежать получения предупреждения в push-навигации, вы можете напрямую использовать:
И затем в вашем контроллере модального представления, когда все закончится, вы можете просто позвонить:
[self dismissViewControllerAnimated:YES completion:nil];
источник
self.navigationController
сделал это для меня.Причина этого предупреждения в том, что я представлял контроллер представления поверх небольшого представления, которое не является полноразмерным представлением. Ниже приведено изображение моего проекта. где при нажатии на четыре варианта выше. Пользователь переходит к другому представлению childviewcontroller (работает как tabViewcontroller). Но childviewcontroller содержит представление небольшого размера. Поэтому, если мы представляем представление childviewcontroller, оно выдает это предупреждение.
И чтобы избежать этого, вы можете представить представление о родителе childviewcontroller
источник
Ждите
viewDidAppear()
:Эта ошибка также может возникнуть, если вы пытаетесь представить контроллер представления до того, как представление действительно появилось, например, представление представления в
viewWillAppear()
или ранее. Попробуйте представить другой вид послеviewDidAppear()
или внутри него.источник
viewDidLoad()
, люди! Я делал эту ошибку очень много раз ...В моем случае я
sampleViewController
добавил представление в качестве подпредставления, а затем попытался представить поповер из представленияsampleViewController
(здесьself
вместоUIViewController
экземпляра):Правильный путь должен быть ниже:
Между прочим, это также работает для случая, который представляет поповер из ячейки табличного представления, вам просто нужно убедиться, что контроллер табличного представления был добавлен как дочерний контроллер представления.
источник
[self addChildViewController:sampleViewController];
, теперь я добавил это, спасибоЯ думаю, что проблема в том, что у вас нет правильной иерархии контроллеров представления. Установите rootviewcontroller приложения и затем отображайте новые представления, выдвигая или представляя на них новые контроллеры представлений. Пусть каждый контроллер представления управляет своими представлениями. Только контроллеры представления контейнера, такие как tabbarviewcontroller, должны когда-либо добавлять другие представления контроллеров представления к своим собственным представлениям. Прочтите руководство по программированию контроллеров представления, чтобы узнать больше о том, как правильно использовать контроллеры представления. https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/
источник
Swift 3
Для тех, кто спотыкается об этом, вот быстрый ответ.
источник
У меня почти такая же проблема. Причина была в том, что я пытался представить «некоторый» контроллер на другом, и после завершения анимации я устанавливал представленный контроллер как root. После этой операции все дальнейшие представления контроллеров приводят меня к предупреждению: « Представление контроллеров представления на контроллерах отдельного представления не рекомендуется ». И я решаю это предупреждение просто настройкой «какого-то» контроллера как root без какой-либо презентации в начале.
Удалены:
Просто сделайте как root без каких-либо презентаций:
источник
Одним из решений этого является, если у вас есть childviewcontroller Таким образом, вы просто представляете viewviewcontroller на его родительском
А для отклонения используйте тот же контроллер dismissview.
Это идеальное решение работает для меня.
источник
Используйте
[self.navigationController presentViewController:xxx animated:YES completion:nil]
в iOS 8.источник
Попробуйте этот код
источник
Попробуйте представить,
TabBarController
если этоTabBarController
приложение на основе.Причина может быть
self
дитя,TabBarController
и вы пытаетесь представить изChildViewController
.источник
Да, я также столкнулся с тем же предупреждением при отображении контроллера оповещений, который был в другом виде. Позже я избежал этого, представив контроллер предупреждений из родительского контроллера представления, как показано ниже:
источник
вам нужно добавить контроллер представления, который будет представлять новый контроллер как дочерний элемент родительского контроллера представления.
Допустим, у вас есть yourMainViewController, затем вы добавляете новый контроллер с именем controllerA, и затем вы хотите представить новый контроллер с именем controllerB от controllerA
Вы должны написать что-то вроде этого:
и в controllerA вы можете представить новый контроллер без предупреждений
источник
В Swift 4.1 и Xcode 9.4.1
Решение
Если напишите так, я получаю ту же ошибку
Я получаю ту же ошибку
Полное решение
источник
Убедитесь, что у вас есть контроллер корневого представления для начала. Вы можете установить его в
didFinishLaunchingWithOptions
.источник
Много причин для этого предупреждения. Мой, потому что у меня есть переход, связанный с ViewController к другому, который будет представлен модально. Но ViewController, от которого я представляю, динамически генерируется PageViewController. Вот почему он отделен в раскадровке. Мое приложение не будет зависать из-за этого; но я хотел бы заставить замолчать предупреждение.
источник
Я достиг этой темы, где у меня есть пользовательская панель навигации, и я вызывал через нее AlertViewController.
Я должен был добавить это как ребенок к моему главному контроллеру представления. Тогда я мог бы позвонить и представить это без предупреждения.
Вы должны добавить свой
Zoomed Image View Controller
дочерний элемент основного ViewController.(например)
Тогда вы сможете вызвать ваш ZoomedImageViewController
источник
Многие ответы верны.
Эта проблема произошла со мной, когда мой коллега добавил AViewController в BViewController. Каким-то образом он просто добавляет представление AViewController в представление BViewController.
Исправлено добавлением bViewController.addChild (aViewController)
источник
Это зависит от того, хотите ли вы показать свое предупреждение или что-то подобное в любом месте вида UIViewController.
Вы можете использовать этот пример кода:
источник
Attempt to present <UIAlertController: 0x7fc01a1eb600> on <ViewController: 0x7fc019821e00> whose view is not in the window hierarchy!