2010-09-29 16 views
19

Czy ktoś może wyjaśnić, jak działa delegat na UIAlertView? Czy jest on automatycznie wywoływany, czy też muszę go wywoływać? Np:Delegaci UIAlertView

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

+0

pisałem rodzajowe klasy do wymiany UIAlertView delegację z callbacków blokowych. Możesz to sprawdzić [tutaj] (http://stavash.wordpress.com/2013/01/31/quick-tip-uialertview-with-a-block-callback/). – Stavash

Odpowiedz

11

Dopóki jesteś prawidłowo ustawiając właściwość delegat UIAlertView i wdrożenie protokołu, zostanie on automatycznie wywoływana, gdy użytkownik kliknie na przycisk w swoim alercie.

Proszę spojrzeć na projekty wymienione w sekcji "Powiązany przykładowy kod" pod numerem http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIAlertViewDelegate_Protocol/UIAlertViewDelegate/UIAlertViewDelegate.html, aby zobaczyć je w akcji.

+0

wygląda na to, że nie wzywałam delegata: self w init, dzięki za te szybką odpowiedź – Joe

2

Metoda delegata jest automatycznie wywoływana przez UIAlertView. Metoda init dla UIAlertView przyjmuje delegata jako jeden z parametrów. Tylko pamiętaj, aby przekazać obiekt, który odpowiada na alertView:clickedButtonAtIndex:.

32

Powiedzmy, że pokazał alert, gdzie „ja”

- (void)showAlert { 
     UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:@"My Alert" 
                 message:@"Do you want to continue?" 
        delegate:self 
        cancelButtonTitle:nil 
        otherButtonTitles:@"No", @"Yes", nil]; 
     [myAlert show]; 
     [myAlert release]; 
} 

delegat było w porządku dla następujących pracować w pliku .m:

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

Twój plik .h będą musiały odwoływać się do UIAlertViewDelegate w sprawozdaniu z realizacji tak:

@interface myViewController : UIViewController <UIAlertViewDelegate> { 
} 

to jest to, co pozwala y nasz plik .m, aby odpowiedzieć na wywołania metody UIAlertViewDelegate.

+2

Posiadanie delegata wymienionego w nagłówku nie jest konieczne, ale jest dobrą praktyką – braden

+0

Dlaczego nie jest to powiedziane w dokumentacji !? https://developer.apple.com/library/ios/documentation/uikit/reference/UIAlertView_Class/UIAlertView/UIAlertView.html#//apple_ref/occ/instm/UIAlertView/initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles: –

10

Oto opakowanie dla delegata, aby można było używać bloków. Przepływ wykonania będzie taki sam, ale przepływ kodu będzie łatwiejszy do naśladowania. Tak więc, użycie:

[YUYesNoListener yesNoWithTitle:@"My Title" message:@"My Message" yesBlock:^ 
{ 
    NSLog(@"YES PRESSED!"); 
} 
noBlock:^ 
{ 
    NSLog(@"NO PRESSED!"); 
}]; 

... i tutaj jest klasa pomocnika:

typedef void(^EmptyBlockType)(); 

@interface YUYesNoListener : NSObject <UIAlertViewDelegate> 

@property (nonatomic, retain) EmptyBlockType yesBlock; 
@property (nonatomic, retain) EmptyBlockType noBlock; 

+ (void) yesNoWithTitle:(NSString*)title message:(NSString*)message yesBlock:(EmptyBlockType)yesBlock noBlock:(EmptyBlockType)noBlock; 

@end 

@implementation YUYesNoListener 

@synthesize yesBlock = _yesBlock; 
@synthesize noBlock = _noBlock; 

- (id) initWithYesBlock:(EmptyBlockType)yesBlock noBlock:(EmptyBlockType)noBlock 
{ 
    self = [super init]; 
    if (self) 
    { 
     self.yesBlock = [[yesBlock copy] autorelease]; 
     self.noBlock = [[noBlock copy] autorelease]; 
    } 
    return self; 
} 

- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 0 && self.noBlock) 
     self.noBlock(); 
    else if (buttonIndex == 1 && self.yesBlock) 
     self.yesBlock(); 

    [_yesBlock release]; 
    [_noBlock release]; 
    [alertView release]; 
    [self release]; 
} 

- (void) alertViewCancel:(UIAlertView *)alertView 
{ 
    if (self.noBlock) 
     self.noBlock(); 
    [_yesBlock release]; 
    [_noBlock release]; 
    [alertView release]; 
    [self release]; 
} 

+ (void) yesNoWithTitle:(NSString*)title message:(NSString*)message yesBlock:(EmptyBlockType)yesBlock noBlock:(EmptyBlockType)noBlock 
{ 
    YUYesNoListener* yesNoListener = [[YUYesNoListener alloc] initWithYesBlock:yesBlock noBlock:noBlock]; 
    [[[UIAlertView alloc] initWithTitle:title message:message delegate:yesNoListener cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil] show]; 
} 

@end