2010-07-21 13 views
11

sto appena iniziato con lo sviluppo iPhone Ho un'applicazione a schede e volevo per visualizzare un registro in forma modale così ho guardato qui Apple Dev e ha fatto questo all'interno di uno dei miei controller di vista ho collegato un pulsante per le seguenti azioni:presente vista modale regolatore

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

quando costruire ottengo "richiesta di membro 'delegato' in qualcosa non una struttura o unione" Se mi libero della seconda linea, si costruisce ma premendo il pulsante non Niente.

Cosa mi manca qui?

+0

Se io uso lo stesso codice su un'applicazione ViewBased ottengo lo stesso errore sulla seconda riga, ma se mi tolgo la linea di vista modale appare quando si preme il pulsante. ... ho bisogno di qualcosa di speciale per la delegazione? e per il modello a schede? – irco

risposta

19

suona come voi non hanno dichiarato un membro delegate per LoginForm. Avrai bisogno di aggiungere del codice che permetta all'istanza di UIViewController di presentare LoginForm in modo modale al termine di LoginForm. Ecco come dichiarare il proprio delegato:

In 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 

In LoginForm.m:

@implementation 

@synthesize delegate; 

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

@end 

Poi nel caso UIViewController che presenta LoginForm (chiamiamolo MyViewController) :

In MyViewController.h:

@interface MyViewController : UIViewController <LoginFormDelegate> 

@end 

In 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

grazie mille ... questo è quello che stavo cercando. L'ultima cosa che dice nella dichiarazione del protocollo è, che non riesco a capire: "Previsto ')' prima di LoginForm" Non vedo molto male con esso. l'unica differenza con il tuo codice è che il mio modulo sta ereditando da UIViewController, ma non sembra che sia correlato a quell'errore – irco

+0

Il mio male ... Ho dimenticato il 'Login classFlame @ prima della dichiarazione del protocollo. Ho modificato la fonte nella mia risposta. –

+0

grazie, ho anche fatto un importazione nel MyViewController in modo che potesse vedere il protocollo, e si compila, ma si blocca ancora prima di colpire la prima riga della funzione ShowLogin la console mostra un'eccezione non rilevata 'NSInvalidArgumentException', la ragione : '- [UIViewController showLogin]: selettore non riconosciuto inviato all'istanza 0x5936080' – irco

0

Sembrerebbe che la vostra classe LoginForm derivi da UIViewController. La classe UIViewController non ha una proprietà delegate, quindi l'errore di compilazione ottenuto.

Il tuo problema è probabilmente che l'azione non viene chiamata in primo luogo. La firma adeguata per un'azione è: è necessario

- (IBAction)showLogin:(id)sender; 

Il sender argomento. Metti un punto di interruzione nel tuo metodo per assicurarti che venga chiamato.

+0

come si dichiara il delegato per loginForm? e sì penso che tu abbia ragione non vedo il punto di interruzione colpito – irco

+0

Questo non è corretto. Un metodo di azione può prendere o zero parametri o uno (il controllo che lo invia), e Interface Builder sarà felice di collegare un controllo fino a un metodo - (IBAction) doWhatever. –

Problemi correlati