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

Как определить, какой UIAlertView называется делегатом.

В делегате alertView, theres метод:

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

Мой вопрос в том, как я могу найти, какой AlertView вызвал этот делегат.

Например, у меня есть несколько предупреждений, которые все используют делегат, но в зависимости от того, какое alertview вызвало этот метод, я хочу настроить различные действия для buttonIndex.

4b9b3361

Ответ 1

Объект alertView, который передается в метод, является фактическим предупреждением, которое используется в методе. Самый простой способ - обеспечить логику внутри этого метода, которая смотрит на объект alertView (возможно, глядя на имя или тег? Это зависит от вас), а затем предоставляет разные действия для каждого.

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
  if (alertView.tag == 1)
  {
    // do something
  }
  else if (alertView.tag == 2)
  {
    // do something else
  }

  // continue for each alertView

}

Ответ 2

Во всех моих проектах у меня есть класс под названием EasyAlertView. Вы можете найти похожий код в Интернете, но в jist вы попадаете в api как:

typedef void (^AlertBlock)(NSUInteger);

/** A less-unwieldly specialization of UIAlertView that allows a Block to be used as the dismissal handler. 
    This is more flexible and compact than the delegate based approach. It allows all the logic to
    be centralized within the launching method and eliminates confusion and object lifetime issues that arise
    when using multiple alerts in the same class bound to a single delegate. */
@interface EasyAlertView : UIAlertView <UIAlertViewDelegate>
{
    AlertBlock _block;
}

+ (id)showWithTitle:(NSString *)title 
            message:(NSString *)message 
         usingBlock:(void (^)(NSUInteger))block 
  cancelButtonTitle:(NSString *)cancelButtonTitle 
  otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION;

@end

Это хорошо, потому что вы можете написать код вроде:

...
[EasyAlertView showWithTitle:@"Stuff happened"
                     message:@"All kinds of stuff just got flung around...  stop the flinging?"
                  usingBlock:^(NSUInteger buttonIndex) {
                     if (buttonIndex == 0) {  // user cancelled via "No" button
                     }
                     else if (buttonIndex == 1) { // user clicked "Yes"
                        // TODO: whatever cool logic you want here
                     }
                  }
           cancelButtonTitle:@"No"
           otherButtonTitles:@"Yes", nil];
...

Это хорошо, поскольку:

  • Вы можете обработать действие, в котором вы также определяете приглашение
  • Абсолютно неважно, что такое UIAlertView. (не проверяя название или тег UIAlertView, которые являются типичными подходами).

Обратите внимание, что обработчик действий может вызвать другую функцию для обработки поведения, если вы хотите, но дело в том, что очень легко связать поведение с подсказкой. Прежде чем мы использовали этот код, у нас были некоторые лабиринты операторов if/else в реализации протокола UIAlertView - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex, которые проверялись на теги/заголовки UIAlertViews.:( Не было буено.

Вот реализация EasyAlertView:

#import "EasyAlertView.h"

@implementation EasyAlertView

- (void) dealloc
{
    [_block release], _block = nil;
    [super dealloc];
}

+ (id)showWithTitle:(NSString *)title message:(NSString *)message usingBlock:(void (^)(NSUInteger))block cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...
{
    EasyAlertView * alert = [[[EasyAlertView alloc] initWithTitle:title
                                                         message:message
                                                        delegate:nil
                                               cancelButtonTitle:cancelButtonTitle
                                               otherButtonTitles:nil] autorelease];

    alert.delegate = alert;
    alert->_block = [block copy];

    va_list args;
    va_start(args, otherButtonTitles);
    for (NSString *buttonTitle = otherButtonTitles; buttonTitle != nil; buttonTitle = va_arg(args, NSString*))
    {
        [alert addButtonWithTitle:buttonTitle];
    }
    va_end(args);

    [alert show];

    return alert;
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (_block)
    {
        _block(buttonIndex);
    }
}

@end

Также см. Усовершенствование для UIAlertView

Ответ 3

Используйте tag свойство

Ответ 4

Я понимаю, что это довольно поздно, но натолкнулся на это, ища решение моей собственной подобной проблемы. Я решил это, назначив мои различные предупреждения как свойства.

Этот пример предполагает ARC и iOS 5, но должен служить хорошим примером. Надеюсь, это поможет.

@property (nonatomic, strong) UIAlertView *passwordAlert;
@property (nonatomic, strong) UIAlertView *warningAlert;

passwordAlert = [[UIAlertView alloc] initWithTitle:@"Password" message:@"Enter password" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Done", nil];
passwordAlert.alertViewStyle = UIAlertViewStyleSecureTextInput;
[passwordAlert show];

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
   if (alertView == passwordAlert) {
      // handle anything for password button indexes here
   }
   if (alertView == warningAlert)_ {
      // handle anything for warning button indexes here
   }
}

Ответ 5

Установите tag для каждого оповещения, которое вы хотите вызвать, alterView.tag=10;, например, затем в теле метода, который вы опубликовали, проверите предупреждение:

if(alertView.tag==10){
   //your alert
}