2010-07-21 16 views
11

Ich bin gerade mit iphone Entwicklung Ich habe eine Tabbed-Anwendung gestartet zu werden, und ich wollte ein Protokoll in Form anzuzeigen modal so sah ich hier Apple Dev und tat dies innerhalb einer meiner Ansicht-Controller I verbunden ein Schaltfläche auf der folgenden Aktion:vorhanden Modal-View-Controller

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

, wenn ich ich „Antrag auf Mitglieder Delegierten in etwas keine Struktur oder Union“ bauen bekommen Wenn ich von der zweiten Zeile loszuwerden, baut aber die Taste drücken tut nichts.

Was fehlt mir hier?

+0

Wenn ich den gleichen Code auf einer ViewBased App verwenden bekomme ich die gleichen Fehler in der zweiten Zeile, aber wenn ich die Linie die modale Ansicht entfernen erscheint, wenn ich die Taste drücken. ..do brauche ich etwas besonderes für die Delegation? und für die Registerkarte Vorlage? – irco

Antwort

19

Klingt so, als hätten Sie kein Mitglied von delegate für LoginForm deklariert. Sie müssen Code hinzufügen, der die UIViewController-Instanz, die LoginForm modal präsentiert, wenn LoginForm abgeschlossen ist. Hier ist, wie Sie Ihre eigenen Delegierten erklären:

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 

Dann in der UIViewController-Instanz, die Loginform präsentiert (nennen wir es 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

vielen dank ... das ist, was ich gesucht habe. Die letzte Sache, die es in der Protokolldeklaration sagt, ist, dass ich nicht herausfinden kann: "Erwartet") vor LoginForm " ich sehe nicht viel falsch damit. Der einzige Unterschied zu Ihrem Code ist, dass mein Formular von UIViewController erbt, aber es sieht nicht so aus, als wäre es mit diesem Fehler verbunden. – irco

+0

Mein Fehler ... Ich habe die '@class LoginForm;' vor der Protokolldeklaration vergessen. Ich habe die Quelle in meiner Antwort bearbeitet. –

+0

danke, ich habe auch einen Import in dem MyViewController, so dass sie das Protokoll sehen konnte, und es kompiliert, aber es stürzt noch bevor die erste Zeile der ShowLogin Funktion die Konsole zeigt eine abgefangene Ausnahme ‚NSInvalidArgumentException‘, Grund schlagen : '- [UIViewController showLogin]: unerkannter Selektor an Instanz 0x5936080 gesendet' – irco

0

Es scheint, dass Ihre LoginForm Klasse von UIViewController abgeleitet ist. Die UIViewController Klasse hat keine delegate Eigenschaft, daher der Kompilierfehler, den Sie bekommen haben.

Ihr Problem ist wahrscheinlich, dass die Aktion nicht an erster Stelle aufgerufen wird. Die richtige Signatur für eine Aktion ist:

- (IBAction)showLogin:(id)sender; 

Die sender Argument erforderlich ist. Fügen Sie einen Haltepunkt in Ihre Methode ein, um sicherzustellen, dass sie aufgerufen wird.

+0

Wie deklariere ich den Delegaten für die loginForm? und ja, ich denke, Sie haben Recht, ich sehe nicht, dass der Breakpoint getroffen wird – irco

+0

Das ist falsch. Eine Aktionsmethode kann entweder Null-Parameter oder Eins (das Steuerelement, das sie sendet) annehmen, und Interface Builder wird glücklich ein Steuerelement bis zu einer - (IBAction) dowhatever-Methode verknüpfen. –

Verwandte Themen