Может кто-нибудь объяснить, как работает делегат в UIAlertView
? Вызывается ли это автоматически или мне нужно его называть? Например:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
Может кто-нибудь объяснить, как работает делегат в UIAlertView
? Вызывается ли это автоматически или мне нужно его называть? Например:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
Пока вы правильно устанавливаете свойство делегата UIAlertView и реализуете протокол, он будет автоматически вызываться, когда пользователь нажимает кнопку в вашем предупреждении.
Взгляните на проекты, перечисленные в разделе "Связанный образец кода", на http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIAlertViewDelegate_Protocol/UIAlertViewDelegate/UIAlertViewDelegate.html, чтобы увидеть его в действии.
Скажем, вы показали предупреждение, где делегат был "я"
- (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.
Ниже приведена оболочка для делегата, чтобы вместо этого использовать блоки. Поток выполнения будет таким же, но поток кода будет легче следовать. Итак, использование:
[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
Метод alertView:clickedButtonAtIndex:
делегата автоматически вызывается UIAlertView
. Метод init для UIAlertView
принимает делегат в качестве одного из параметров. Просто не забудьте передать объект, отвечающий на alertView:clickedButtonAtIndex:
.