2012-01-11 9 views

Respuesta

6

Los delegados de la aplicación no administran una vista. Debe presentar un controlador de vista modal desde el método -viewDidAppear: del primer controlador de vista que se pone en pantalla en -application:didFinishLaunchingWithOptions:.

+0

De hecho, estoy tratando de presentar un modalViewController de un UIView, y tratando de presentar esto en la parte superior más viewcontroller, alguna idea? – adit

+1

Los controladores de vista modal solo pueden ser presentados por otros controladores de vista. Las vistas que administran no tienen conocimiento de su propio controlador y mucho menos de otros controladores de vista. –

+0

Si bien esta respuesta señala algunos de los malentendidos del OP, en realidad no responde la pregunta. Consulte mi respuesta a: UIWindow – Steve

11

Usa tu rootViewController. Puede presentar un controlador de vista modal desde cualquier subclase de controlador de vista. Si su raíz VC es un UITabBarController, entonces usted puede hacer:

[self.tabBarController presentModalViewControllerAnimated:YES] 

o si es un controlador de navegación:

[self.navigationController presentModalViewControllerAnimated:YES] 

etc.

EDIT: MVC

Por tratando de presentar un controlador desde dentro de una vista, estás rompiendo el patrón MVC. Generalmente, una vista se refiere a su apariencia y exposición de interfaces para comunicar el estado de la interfaz de usuario a su controlador. Por ejemplo, si tiene un UIButton en su vista y desea que presente un controlador de vista modal, no debe cablear la vista para hacerlo. En cambio, cuando un controlador crea una instancia de la vista, el controlador configura el botón configurándose como un objetivo para recibir la acción touchUpInside donde puede presentar el controlador de vista modal apropiado.

La vista en sí no tiene (y no debe) tener este conocimiento contextual para hacer el trabajo de un controlador.

+2

No funciona si el 'rootViewController' ya presenta un controlador de vista modal. – Steve

+0

cierto, esto fue solo un ejemplo. No conozco la lógica completa de la aplicación OP. También acuerde con todo lo que es mejor entender las técnicas adecuadas para poder desviarse con pleno conocimiento de lo que está haciendo cuando sea necesario. – XJones

+0

Un enfoque basado en 'UIWindow' funciona siempre, en general, sin lógica personalizada ... al igual que un' UIAlertView' siempre funciona. – Steve

10

La mejor manera de hacerlo es crear una nueva UIWindow, establecer su propiedad windowLevel, y presentar su UIViewController en esa ventana.

Así es como UIAlertView s trabajo.

interfaz

@interface MyAppDelegate : NSObject <UIApplicationDelegate> 

@property (nonatomic, strong) UIWindow * alertWindow; 

... 

- (void)presentCustomAlert; 

@end 

Implementación:

@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 
+0

Funciona como un encanto. –

+0

respuesta magníficamente útil – Fattie

Cuestiones relacionadas