2010-06-10 7 views
6

Je suis malade d'écrire UIAlertView de base de, à savoir:Écrire une fonction pour UIAlertView?

UIAlertView *alert = [[UIAlertView alloc] initWith...]] //etc 

au lieu de le faire, est-il possible de mettre tout cela dans une fonction « d'aide », où je peux retourner le buttonIndex, ou quel que soit une alerte retourne habituellement? Pour une fonction d'aide simple, je suppose que vous pourriez fournir des paramètres pour le titre, le message, je ne suis pas sûr si vous pouvez transmettre des délégués dans un paramètre ou des informations groupées.

En pseudo-code, il pourrait ressembler à ceci:

someValueOrObject = Print_Alert(Title="", Message="", Delegate="", Bundle="") // etc 

Toute aide sur ce serait génial.

Merci

+0

Cela pourrait être mieux étiqueté. Pensez à ajouter 'objective-c',' iphone', etc. –

+0

Désolé. Merci de votre aide. – zardon

Répondre

2

C'est ce que je l'ai écrit, quand je suis tombé malade de faire la même:

-(void)alert:(NSString *)title withBody:(NSString *)message firstButtonNamed:(NSString *)firstButtonName { 
    [self alert: title withBody: message firstButtonNamed: firstButtonName withExtraButtons: nil informing: nil]; 
} 

-(void)alert:(NSString *)title withBody:(NSString *)message firstButtonNamed:(NSString *)firstButtonName informing:(id)delegate { 
    [self alert: title withBody: message firstButtonNamed: firstButtonName withExtraButtons: nil informing: delegate]; 
} 

-(void)alert:(NSString *)title withBody:(NSString *)message firstButtonNamed:(NSString *)firstButtonName withExtraButtons:(NSArray *)otherButtonTitles informing:(id)delegate { 
    UIAlertView *alert = [[UIAlertView alloc] 
       initWithTitle: title 
       message: message 
       delegate: delegate 
       cancelButtonTitle: firstButtonName 
       otherButtonTitles: nil]; 
    if (otherButtonTitles != nil) { 
    for (int i = 0; i < [otherButtonTitles count]; i++) { 
     [alert addButtonWithTitle: (NSString *)[otherButtonTitles objectAtIndex: i]]; 
    } 
    } 
    [alert show]; 
    [alert release]; 
} 

Vous ne pouvez pas écrire une fonction qui affiche une alerte, puis retourner une valeur comme un buttonIndex cependant, car cette valeur de retour ne se produit que lorsque l'utilisateur appuie sur un bouton et que votre délégué fait quelque chose. En d'autres termes, le processus de poser une question avec le UIAlertView est asynchrone.

+0

Oh, d'accord. Merci de votre aide! – zardon

14

En 4.0+ vous pouvez simplifier le code d'alerte en utilisant des blocs, un peu comme ceci:

CCAlertView *alert = [[CCAlertView alloc] 
    initWithTitle:@"Test Alert" 
    message:@"See if the thing works."]; 
[alert addButtonWithTitle:@"Foo" block:^{ NSLog(@"Foo"); }]; 
[alert addButtonWithTitle:@"Bar" block:^{ NSLog(@"Bar"); }]; 
[alert addButtonWithTitle:@"Cancel" block:NULL]; 
[alert show]; 

Voir Lambda Alert on GitHub.

+0

Merci, j'avais besoin de ça! –

+0

Solution très lisse. J'ai bien travaillé pour moi. – Kongress

+0

Est-il possible de le faire sans utiliser la classe 'LambdaAlert'? – Chris