Как я могу представить контроллер модального представления из представления делегата приложения, самого верхнего? Попытка представить модальный контроллер просмотра из UIView, что сбило меня с толку.
PresentModalViewController из делегата приложения
Ответ 1
Прикладные делегаты не управляют представлением. Вы должны представить modal view controller из метода -viewDidAppear:
первого контроллера представления, который будет помещен на экран в -application:didFinishLaunchingWithOptions:
.
Ответ 2
Используйте rootViewController
. Вы можете представить modal view controller из любого подкласса контроллера вида. Если ваш корневой VC является UITabBarController, вы можете сделать:
[self.tabBarController presentModalViewControllerAnimated:YES]
или если его контроллер навигации:
[self.navigationController presentModalViewControllerAnimated:YES]
и др.
EDIT: MVC
Пытаясь представить контроллер изнутри представления, вы нарушаете шаблон MVC. Как правило, представление касается его внешнего вида и отображения интерфейсов для передачи состояния пользовательского интерфейса его контроллеру. Например, если у вас есть UIButton
в вашем представлении, и вы хотите, чтобы он представлял собой контроллер модального представления, вам не нужно прокручивать представление для этого. Вместо этого, когда контроллер создает экземпляр представления, контроллер настраивает кнопку, устанавливая себя как цель для приема действия touchUpInside
, где он может представлять соответствующий контроллер модального представления.
Само представление не должно (и не должно) иметь это контекстуальное знание для выполнения работы контроллера.
Ответ 3
Лучший способ сделать это - создать новый UIWindow
, установить его свойство windowLevel
и представить ваш UIViewController
в этом окне.
Вот как работает UIAlertView
.
Интерфейс
@interface MyAppDelegate : NSObject <UIApplicationDelegate>
@property (nonatomic, strong) UIWindow * alertWindow;
...
- (void)presentCustomAlert;
@end
Реализация:
@implementation MyAppDelegate
@synthesize alertWindow = _alertWindow;
...
- (void)presentCustomAlert
{
if (self.alertWindow == nil)
{
CGRect screenBounds = [[UIScreen mainScreen] bounds];
UIWindow * alertWindow = [[UIWindow alloc] initWithFrame:screenBounds];
alertWindow.windowLevel = UIWindowLevelAlert;
}
SomeViewController * myAlert = [[SomeViewController alloc] init];
alertWindow.rootViewController = myAlert;
[alertWindow makeKeyAndVisible];
}
@end