presentModalViewController из приложения делегата - PullRequest
10 голосов
/ 11 января 2012

Как я могу представить модальный контроллер вида из представления делегата приложения, самого верхнего? Попытка представить модальный контроллер представления от UIView, который меня смутил.

Ответы [ 3 ]

11 голосов
/ 11 января 2012

Используйте свой rootViewController.Вы можете представить модальный контроллер представления из любого подкласса контроллера представления.Если ваш корневой VC является UITabBarController, то вы можете сделать:

[self.tabBarController presentModalViewControllerAnimated:YES]

или, если это контроллер навигации:

[self.navigationController presentModalViewControllerAnimated:YES]

и т. Д.

EDIT: MVC

Пытаясь представить контроллер из представления, вы нарушаете шаблон MVC.Как правило, представление касается его внешнего вида и предоставления интерфейсов для передачи состояния пользовательского интерфейса его контроллеру.Например, если у вас есть UIButton в вашем представлении, и вы хотите, чтобы оно представляло контроллер модального представления, вам не нужно жестко связывать представление для этого.Вместо этого, когда контроллер создает экземпляр представления, контроллер настраивает кнопку, устанавливая себя в качестве цели для получения действия touchUpInside, в котором он может представить соответствующий контроллер модального представления.

Само представление не делает (ине должен обладать этими контекстными знаниями для выполнения работы диспетчера.

10 голосов
/ 11 января 2012

Лучший способ сделать это - создать новое 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
6 голосов
/ 11 января 2012

Делегаты приложения не управляют представлением. Вы должны представить модальный контроллер вида из метода -viewDidAppear: первого контроллера вида, который отображается на экране в -application:didFinishLaunchingWithOptions:.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...