2010-07-21 22 views
11

estoy acaba de empezar con el desarrollo del iPhone Tengo una aplicación con pestañas y quería mostrar un registro en forma modal así que busqué aquí Apple Dev y lo hizo dentro de una de mis controladores de vista I conectado un botón para la siguiente acción:presentes vista modal controlador

#import "LoginForm.h" 
... 
-(IBAction)showLogin{ 
LoginForm *lf = [[LoginForm alloc]initWithNibName:@"LoginForm" bundle:nil]; 
lf.delegate = self; 
lf.modalPresentationStyle = UIModalTransitionStyleCrossDissolve; 
[self presentModalViewController:lf animated:YES]; 
} 

cuando construyo consigo "solicitud de 'delegado' miembro en algo que no es una estructura o unión" Si me deshago de la segunda línea, se acumula pero al presionar el botón lo hace nada.

¿Qué me falta aquí?

+0

Si utilizo el mismo código en una aplicación ViewBased me sale el mismo error en la segunda línea, pero si quito la línea de la vista modal aparece al pulsar el botón. ¿Necesito algo especial para la delegación? y para la plantilla con pestañas? – irco

Respuesta

19

Parece que no ha declarado delegate miembro para LoginForm. Tendrá que agregar un código que permita a la instancia de UIViewController presentar LoginForm de forma modal cuando se complete Login Form. Aquí es cómo declarar su propio delegado:

En LoginForm.h:

@class LoginForm; 

@protocol LoginFormDelegate 
- (void)loginFormDidFinish:(LoginForm*)loginForm; 
@end 

@interface LoginForm { 
    // ... all your other members ... 
    id<LoginFormDelegate> delegate; 
} 

// ... all your other methods and properties ... 

@property (retain) id<LoginFormDelegate> delegate; 

@end 

En LoginForm.m:

@implementation 

@synthesize delegate; 

//... the rest of LoginForm's implementation ... 

@end 

Luego, en la instancia UIViewController que presenta LoginForm (vamos a llamarlo MyViewController) :

En MyViewController.h:

@interface MyViewController : UIViewController <LoginFormDelegate> 

@end 

En MyViewController.m:

/** 
* LoginFormDelegate implementation 
*/ 
- (void)loginFormDidFinish:(LoginForm*)loginForm { 
    // do whatever, then 
    // hide the modal view 
    [self dismissModalViewControllerAnimated:YES]; 
    // clean up 
    [loginForm release]; 
} 

- (IBAction)showLogin:(id)sender { 
    LoginForm *lf = [[LoginForm alloc]initWithNibName:@"LoginForm" bundle:nil]; 
    lf.delegate = self; 
    lf.modalPresentationStyle = UIModalTransitionStyleCrossDissolve; 
    [self presentModalViewController:lf animated:YES]; 
} 
+0

muchas gracias ... esto es lo que estaba buscando. Lo último que dice dentro de la declaración de protocolo es que no puedo entender: "Esperado") "antes de LoginForm" No veo demasiado mal con él. la única diferencia con su código es que mi formulario hereda de UIViewController, pero no parece estar relacionado con ese error – irco

+0

Mi mal ... Olvidé el '@clase de inicio de sesión de clase;' antes de la declaración del protocolo. He editado la fuente en mi respuesta. –

+0

gracias, también hice una importación en el MyViewController para que pudiera ver el protocolo, y se compila pero todavía falla antes de llegar a la primera línea de la función ShowLogin la consola muestra una excepción no capturada 'NSInvalidArgumentException', razón : '- [UIViewController showLogin]: selector no reconocido enviado a la instancia 0x5936080' – irco

0

Parecería que su clase LoginForm deriva de UIViewController. La clase UIViewController no tiene una propiedad delegate, de ahí el error de compilación que obtuvo.

Probablemente su problema es que la acción no se llama en primer lugar. La firma apropiada para una acción es: se requiere

- (IBAction)showLogin:(id)sender; 

la sender argumento. Ponga un punto de interrupción en su método para asegurarse de que se llame.

+0

¿cómo declaro el delegado para el loginForm? y sí, creo que tienes razón, no veo que se llegue al punto de interrupción – irco

+0

Esto es incorrecto. Un método de acción puede tomar cero parámetros o uno (el control que lo envía), y el Constructor de Interfaces conectará un control a un método - (IBAction) doWhatever. –

Cuestiones relacionadas