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
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
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.
wygląda na to, że nie wzywałam delegata: self w init, dzięki za te szybką odpowiedź – Joe
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:
.
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.
Posiadanie delegata wymienionego w nagłówku nie jest konieczne, ale jest dobrą praktyką – braden
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: –
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
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