2012-03-31 18 views
5

Estoy creando un sistema de inicio de sesión dentro de mi aplicación que se llamará varias veces. Entonces, en lugar de copiar y pegar el código en varios lugares, por supuesto estoy haciendo una clase NSObject para poder llamar a la clase cuando sea necesario.Mostrar un UIAlertView en NSObject Clase

El sistema de inicio de sesión mostrará UIAlertView, y cuando se toque "OK", el sistema intentará iniciar sesión. Puedo llamar a la clase y se mostrará UIAlertView, pero no puedo decir qué botones están pulsados. Aquí está mi código:

//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 

Por ahora, antes de poner UITextFields en la vista, me Solo quiero que la aplicación sepa qué botón se pulsó. Testing aparece en el registro, pero no aparecen Here ni Tapped. ¡Gracias!

+2

No anule initialize' (void) '+ !!!! '+ initialize' es ** mucho ** diferente de' -init'! Debes asegurarte de estar apropiadamente llamando 'super' también. Además, asegúrese de estar siguiendo las pautas de MVC. Por lo general, los objetos del modelo no deben mostrar elementos de UI. –

+0

Jack Lawrence tiene razón: ¿quién es un delegado de UIAlertView? ni siquiera está inicializado, así es como no se llama como un delegado. –

+1

¡Tienen razón! No he hecho esto antes, así que cambié + (void) initialize a - (id) init y funcionó. Jack Lawrence: escribe tu comentario como respuesta para que pueda marcarte bien. –

Respuesta

1

Su vista de alerta no debe ser invocada por el método de clase + (void) initialize sino por el método de instancia - (id) init, por eso su instancia no recibe las notificaciones.

se llama al método de clase "+ (void) initialize" cuando la clase carga por primera vez.

el método de instancia "- (id) init" tiene su nombre que comienza por init, y se invoca cuando se crea (instancia) su objeto.

-(id)init { 

    //alert view 

    self = [super init]; 

    return self; 

} 
+0

Gracias por su ayuda. Para las personas que lean esta respuesta: change + (void) initialize to - (id) init. –

+0

mejorado de acuerdo con @JackLawrence comentario – moxy

0

Sólo

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

Cuando se utiliza self en un método de la clase que usted se refiere a la propia clase, en lugar de una instancia de la clase. Sin embargo, su método de delegado es un método de instancia. Probablemente desee que la persona que llama cree una instancia de inicio de sesión y que la instancia cree la alerta, además de ser su delegado.

0

Es muy sencillo:

crear una propiedad para su clase NSObject en su vista de clase controlador:

en h archivo:

@property (no atómica, retener) LoginCheckNSObject * LoginCheckerObject;

en m archivo:

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

@ Jack Humphries, agréguelo en su clase de controlador de vista. Eso es – SathishKumarEro