2010-07-21 22 views
11

jestem dopiero zaczynasz z iPhone rozwoju Mam aplikacji kartach i chciałem, aby wyświetlić dziennik w formie modally więc wyglądał tutaj Apple Dev i zrobił to w jednym z moim zdaniem kontrolerów mam podłączony przycisk na następujące działania:obecny widok modalne kontroler

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

kiedy zbudować otrzymuję „wniosek o członkowskim«delegata»w coś nie struktury lub unii” Gdybym pozbyć drugiej linii, buduje ale naciskając przycisk robi nic.

Czego mi tu brakuje?

+0

jeśli mogę użyć tego samego kodu na ViewBased aplikacji i uzyskać ten sam błąd na drugiej linii, ale jeśli usunąć wiersz modalna widok pojawia się po naciśnięciu przycisku. ... czy potrzebuję czegoś specjalnego dla delegacji? i dla szablonu z zakładkami? – irco

Odpowiedz

19

Wygląda na to, że nie zadeklarowałeś członka w postaci LoginForm jako delegate. Musisz dodać kod, który pozwala modułowi UIViewController wyświetlając LoginForm modalnie po zakończeniu logowania. Oto w jaki sposób zadeklarować swoją Delegat:

W 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 

W LoginForm.m:

@implementation 

@synthesize delegate; 

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

@end 

Następnie w instancji UIViewController prezentującej LoginForm (nazwijmy go MyViewController) :

W MyViewController.h:

@interface MyViewController : UIViewController <LoginFormDelegate> 

@end 

W 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

dziękuję bardzo ... tego właśnie szukałem. Ostatnią rzeczą, o której mówi się w deklaracji protokołu, jest to, że nie mogę wymyślić: "Oczekiwany") "przed LoginForm" Nie widzę w tym nic złego. jedyną różnicą w twoim kodzie jest to, że moja forma dziedziczy z UIViewController, ale nie wygląda jak jest związana z tym błędem – irco

+0

Mój zły ... Zapomniałem "@klass LoginForm;" przed deklaracją protokołu. Edytowałem źródło w mojej odpowiedzi. –

+0

dzięki, ja również nie przywóz w MyViewController tak, że może zobaczyć protokół i kompiluje ale nadal wywala przed pójściem na pierwszą linię funkcji ShowLogin konsola pokazuje przechwycony wyjątek „NSInvalidArgumentException”, powód : '- [UIViewController showLogin]: nierozpoznany selektor wysłany do instancji 0x5936080' – irco

0

Wygląda na to, że klasa LoginForm pochodzi z UIViewController. Klasa UIViewController nie ma właściwości delegate, dlatego wystąpił błąd kompilacji.

Twój problem polega prawdopodobnie na tym, że akcja nie zostanie wywołana w pierwszej kolejności. Właściwym podpisem dla akcji jest:

- (IBAction)showLogin:(id)sender; 

Argument sender jest wymagany. Umieść punkt przerwania w swojej metodzie, aby upewnić się, że jest wywoływany.

+0

Jak zadeklarować delegata na loginform? i tak myślę, że masz rację, nie widzę punktu przełomowego trafionego – irco

+0

To jest niepoprawne. Metoda działania może przyjmować albo parametry zerowe, albo jedno (sterowanie wysyłające), a Konstruktor interfejsów z radością przechwyci kontrolę do - (IBAction) do jakiejkolwiek metody. –

Powiązane problemy