Можно ли проверить внутри класса ViewController, что он представлен как модальный контроллер представления?
iphone
ios
view
controller
modal-dialog
lukewar
источник
источник
nil == nil
возвращаетсяYES
, а это не тот результат, который нам нужен.Если вы ищете iOS 6+, этот ответ устарел, и вам следует проверить ответ Габриэле Петронеллы.
Нет удобного способа сделать это как свойство или метод, свойственный UIKit. Что вы можете сделать, так это проверить несколько аспектов вашего контроллера, чтобы убедиться, что он представлен как модальный.
Итак, чтобы проверить, представлен ли текущий (представленный
self
в приведенном ниже коде) контроллер модальным способом или нет, у меня есть функция, указанная ниже, либо вUIViewController
категории, либо (если вашему проекту не нужно использовать другие контроллеры UIKit, какUITableViewController
например) в базовом контроллере, который наследуются другими моими контроллерамиРЕДАКТИРОВАТЬ: я добавил последнюю проверку, чтобы увидеть, используется ли UITabBarController, и вы представляете другой UITabBarController как модальный.
РЕДАКТИРОВАТЬ 2: добавлена проверка iOS 5+, где
UIViewController
больше не отвечаетparentViewController
, аpresentingViewController
вместо этого.РЕДАКТИРОВАТЬ 3: Я создал для него суть на всякий случай https://gist.github.com/3174081
источник
modalViewController
свойство устарело в iOS 6. В документации предлагается использовать егоpresentedViewController
.NSLog(@"%@", self.navigationController.parentViewController)
отпечатки(null)
- не могли бы вы объяснить почему? Мой ViewController связан с контроллером модального представления через navController в раскадровке..parentViewController
устарела,.presentingViewController
должна использоваться вместо нее .В iOS5 +, как вы можете видеть в описании класса UIViewController , вы можете получить его из свойства «presentingViewController».
PresentingViewController Контроллер представления, представивший этот контроллер представления. (Только для чтения)
@property (неатомный, только для чтения) UIViewController * PresentingViewController
Обсуждение
Если контроллер представления, получивший это сообщение, представлен другим контроллером представления, это свойство содержит контроллер представления, который его представляет. Если контроллер представления не представлен, но представлен один из его предков, это свойство содержит контроллер представления, представляющий ближайшего предка. Если ни контроллер представления, ни какой-либо из его предков не представлены, это свойство имеет значение nil.
Доступность
Доступно в iOS 5.0 и новее.
Объявлено в
UIViewController.h
источник
presentingViewController
. Он также будет работать в контроллерах представления контейнера, поскольку он автоматически проходит по предкам.Если нет, вы можете определить свойство для this (
presentedAsModal
) в своем подклассе UIViewController и установить егоYES
перед представлением ViewController в виде модального представления.Вы можете проверить это значение в своем
viewWillAppear
переопределении.Я считаю, что нет официального свойства, которое бы указывало, как представлено представление, но ничто не мешает вам создать свое собственное.
источник
UINavigationController
модальный ... если только вы не создаете настраиваемый контроллер навигации, чтобы добавить это свойство. И после этого внутри контроллеров вам придется выполнять приведениеself.navigationController
к этому пользовательскому классу каждый раз, когда вам нужно проверять, представлен ли контроллер как модальныйОтвет Петронеллы не работает, если self.navigationController представлен модально, но self не равен self.navigationController.viewControllers [0], в этом случае будет отправлено self.
Вот как вы можете решить эту проблему.
И в Swift:
источник
Это должно работать.
источник
UINavigationController
иUITabBarController
случаев. Пока что это работает довольно хорошоЛучший способ проверить
источник
Если вам не нужно различать полноэкранные модальные представления и немодальные представления, как в моем проекте (я имел дело с проблемой, которая возникает только с листами форм и листами страниц), вы можете использовать modalPresentationStyle свойство UIViewController:
источник
В Swift :
источник
В моем проекте у меня есть контроллер представления (Detail), который может быть представлен либо модально (при добавлении нового элемента), либо с помощью push (при редактировании существующего) с помощью главного контроллера представления. Когда пользователь нажимает [Готово], контроллер детального представления вызывает метод главного контроллера представления, чтобы уведомить о его готовности к закрытию. Мастер должен определить, как Детализация представлена, чтобы знать, как ее закрыть. Вот как я это делаю:
источник
Подобный взлом может сработать.
Однако я думаю, что мой предыдущий ответ - более чистое решение.
источник
Для меня сработало следующее:
Насколько я тестировал, это работает для iOS7 и iOS8. Однако на iOS6 не пробовал.
источник
Я немного огляделся, чтобы найти правильный ответ на этот вопрос, и не смог найти ни одного, охватывающего все возможные сценарии. Я написал эти несколько строк кода, которые, кажется, делают свою работу. Вы можете найти несколько встроенных комментариев, чтобы выяснить, что было проверено.
Надеюсь на эту помощь.
источник
Вот моя модифицированная версия @ GabrielePetronella
isModal
, которая работает с автономными контроллерами представления, поскольку сначала проходит по иерархии parentViewController. Также вытащил код на несколько строк, чтобы было понятно, что он делает.источник