2012-03-31 15 views
5

Buduję system logowania w mojej aplikacji, który będzie wywoływany kilka razy. Zamiast kopiować i wklejać kod do kilku miejsc, oczywiście tworzę klasę NSObject, aby zamiast tego móc wywołać tę klasę, gdy zajdzie taka potrzeba.Wyświetl UIAlertView w klasie NSObject

System logowania wyświetli UIAlertView, a po naciśnięciu "OK" system podejmie próbę zalogowania. Mogę zadzwonić do klasy i wyświetli się UIAlertView, ale nie wiem, które przyciski są kliknięte. Tu jest mój kodu:

//Calling the login system 

Login *login = [[Login alloc] init]; 

Login.h:

#import <Foundation/Foundation.h> 

@interface Login : NSObject <UIAlertViewDelegate> { 

} 

@end 

Login.m:

#import "Login.h" 

@implementation Login 

+(void)initialize { 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Login" message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil]; 

    [alert show]; 
    [alert release]; 

    NSLog(@"Testing"); 

} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 

    NSLog(@"Here"); 

    NSString *title = [alertView buttonTitleAtIndex:buttonIndex]; 

    if([title isEqualToString:@"OK"]) { 

     NSLog(@"Tapped"); 

    } 

} 

@end 

Na razie, zanim kładę UITextFields w widoku, ja po prostu chcę, aby aplikacja wiedziała, który przycisk został naciśnięty. Testing pojawia się w dzienniku, ale nie pojawia się ani Here ani Tapped. Dzięki!

+2

Nie zastępują '+ (void) initialize' !!!! '+ initialize' jest ** dużo ** inny niż' -init'! Musisz się upewnić, że odpowiednio nazywasz 'super'. Ponadto upewnij się, że postępujesz zgodnie ze wskazówkami MVC. Zwykle obiekty modelu nie powinny wyświetlać elementów interfejsu użytkownika. –

+0

Jack Lawrence ma rację: kto jest sobą, że jest delegatem UIAlertView? nawet nie został zainicjowany, dlatego nie jest wywoływany jako delegat. –

+1

Masz rację! Nie robiłem tego wcześniej, więc zmieniłem + (void) initialize na - (id) init i zadziałało. Jack Lawrence: napisz swój komentarz jako odpowiedź, aby dobrze Cię oznaczyć. –

Odpowiedz

1

Twój widok alertu nie powinien być wywoływany metodą class + (void) initialize, ale metodą init - (id), dlatego Twoja instancja nie otrzymuje powiadomień.

metoda klasy "+ (void) initialize" jest wywoływana przy pierwszym załadowaniu klasy.

Metoda instancji "- (id) init" ma swoją nazwę rozpoczynającą się od init i jest wywoływana podczas tworzenia (tworzenia instancji) obiektu.

-(id)init { 

    //alert view 

    self = [super init]; 

    return self; 

} 
+0

Dzięki za pomoc. Dla osób czytających tę odpowiedź: change + (void) initialize to - (id) init. –

+0

ulepszony zgodnie z komentarzem @JackLawrence – moxy

0

Wystarczy

switch(buttonIndex){ 
    case 0: 
     NSLog(@"Tapped First Button"); 
     break; 
    case 1: 
     break; 
    default: 
     break; 
} 
0

Podczas korzystania self w metodzie klasy masz na myśli samej klasy, a nie instancją klasy. Jednak twoja metoda delegata jest metodą instancji. Prawdopodobnie chcesz, aby wywołujący utworzył instancję logowania i aby instancja utworzyła alert, a także będzie jego delegatem.

0

To proste:

Tworzenie nieruchomości dla swojej klasy NSObject w widoku klasy kontrolera:

w h pliku:

@property (nonatomic, zachowują) LoginCheckNSObject * LoginCheckerObject;

wm pliku:

self.LoginCheckerObject=[[LoginCheckNSObject alloc] init]; 
[self.LoginCheckerObject setDelegate:self]; 
[self.LoginCheckerObject TrackNowLogin]; 
+0

@ Jack Humphries, dodaj go do klasy kontrolera widoku. To jest to – SathishKumarEro