Подтвердить что ты не робот

Представители UIAlertView

Может кто-нибудь объяснить, как работает делегат в UIAlertView? Вызывается ли это автоматически или мне нужно его называть? Например:

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

4b9b3361

Ответ 1

Пока вы правильно устанавливаете свойство делегата UIAlertView и реализуете протокол, он будет автоматически вызываться, когда пользователь нажимает кнопку в вашем предупреждении.

Взгляните на проекты, перечисленные в разделе "Связанный образец кода", на http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIAlertViewDelegate_Protocol/UIAlertViewDelegate/UIAlertViewDelegate.html, чтобы увидеть его в действии.

Ответ 2

Скажем, вы показали предупреждение, где делегат был "я"

- (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];
}

Для того, чтобы следующие файлы работали в вашем файле .m:

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

Ваш .h файл должен будет ссылаться на UIAlertViewDelegate в инструкции реализации следующим образом:

@interface myViewController : UIViewController <UIAlertViewDelegate> {
}

Это то, что позволяет вашему файлу .m отвечать на вызовы метода UIAlertViewDelegate.

Ответ 3

Ниже приведена оболочка для делегата, чтобы вместо этого использовать блоки. Поток выполнения будет таким же, но поток кода будет легче следовать. Итак, использование:

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

... и вот вспомогательный класс:

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

Ответ 4

Метод alertView:clickedButtonAtIndex: делегата автоматически вызывается UIAlertView. Метод init для UIAlertView принимает делегат в качестве одного из параметров. Просто не забудьте передать объект, отвечающий на alertView:clickedButtonAtIndex:.