¿AppDelegate puede ser un delegado de vista modal?

Estoy tratando de que se muestre una vista modal de Términos de servicio cuando se inicia mi aplicación, cuando la preferencia de configuración indica que el usuario no ha aceptado los términos de uso.

Entonces, en mi appDelegate en ApplicationDidFinishLaunchingWithOptions, tengo este código:

    if (TOSAcceptedPrefValue) { //has not been accepted
    // Create the root view controller for the navigation controller
    TermsOfServiceController *termsOfServiceController = [[TermsOfServiceController alloc]
                                                          initWithNibName:@"TermsOfServiceController" bundle:nil];

    // Create the navigation controller and present it modally.
    UINavigationController *navigationController = [[UINavigationController alloc]
                                                    initWithRootViewController:termsOfServiceController];

    termsOfServiceController.delegate = self;

    navigationController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController:navigationController animated:YES];

    [navigationController release];
    [TermsOfServiceController release];

    NSLog(@"1");

}

Sin embargo, Xcode está indicando que termsOfServiceController.delegate = self es "Asignar a 'id' del tipo incompatible 'MyAppAppDelegate *'".

Creo que implemento completamente el protocolo modal en mi encabezado AppDelegate:

@protocol TOSModalViewDelegate

- (void)didAcceptTermsOfService:(NSString *)message;
- (void)didRejectTermsOfService:(NSString *)message;

@end

@interface MyAppAppDelegate : NSObject <UIApplicationDelegate, TOSModalViewDelegate> ...

y en el encabezado modalview:

@protocol ModalViewDelegate ;
@interface TermsOfServiceController : UIViewController {
id<ModalViewDelegate>   delegate; ...
...
@property (nonatomic, assign) id<ModalViewDelegate> delegate;

y lo sintetizo en el archivo de implementación modalview.

Por esto ejemplo, Moví mi código en el archivo AppDelegate.m después de que se creara una instancia de la ventana, pero todavía tengo la advertencia de Xcode.

La advertencia da como resultado un bloqueo de la aplicación con este error:

2011-09-05 08: 34: 12.237 MyApp [4416: 207] TOSAcceptedPrefValue = 0 2011-09-05 08: 34: 13.732 MyApp [4416: 207] displayWelcomeScreenPrefValue = 0 2011-09-05 08: 34: 42.889 MyApp [ 4416: 207] - [MyAppAppDelegate presentModalViewController: animado:]: selector no reconocido enviado a la instancia 0x552b430 2011-09-05 08: 34: 42.892 MyApp [4416: 207] *** Finalizando la aplicación debido a una excepción no detectada 'NSInvalidArgumentException', motivo: '- [MyAppAppDelegate presentModalViewController: animado:]: selector no reconocido enviado a la instancia 0x552b430'

Entonces, mi pregunta es, ¿es posible mostrar una vista modal desde el appdelegate y, de ser así, qué debo cambiar para que suceda?

Gracias por su ayuda

preguntado el 05 de septiembre de 11 a las 13:09

1 Respuestas

El error es porque MyAppAppDelegate no es un UIViewController subclase, y por lo tanto no puede manejar presentModalViewController:animated:.

Entonces no, el delegado de su aplicación no puede presentar un controlador modalViewController, tiene que ser presentado por un controlador de vista real. Esto no es difícil de hacer, solo cree uno que muestre sus términos en viewDidLoad, y responde apropiadamente cuando el controlador modal sale, para hacer lo que tenga que hacer a continuación.

Respondido el 05 de Septiembre de 11 a las 18:09

Está bien. ¡Gracias por la explicación! Entonces, ¿estás diciendo que mi controlador de primera vista normal (una vista de perfil) se muestre a través de AppDelegate pero inmediatamente, el controlador de vista de perfil verificará su viewdidload para ver si es necesario mostrar los términos de servicio? - Jazzmine

Eso es correcto. Los detalles dependen, como siempre, de exactamente lo que necesita hacer. - Paul Lynch

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.