Кнопка обнаружения нажата при наличии нескольких видов предупреждений - PullRequest
27 голосов
/ 19 августа 2011

У меня несколько представлений предупреждений в одном представлении, и я использую этот код для определения, какая кнопка была нажата:

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

    NSString *title = [alertView buttonTitleAtIndex:buttonIndex];  

    if ([title isEqualToString:@"OK"]) {

          //for one alert view
          [passCode becomeFirstResponder];

     } else if ([title isEqualToString:@" OK "]) {

        //for another alert view, had to change "OK" to " OK "
        [passCodeConfirm becomeFirstResponder];

    }
}   

Теперь, поскольку в одном представлении есть несколько представлений предупреждений, которые делают разные вещи, я должен заставить пользователя думать, что «ОК» и «ОК» - это то же самое. Это работает и выглядит хорошо, но это выглядит немного грязно. Конечно, есть другой способ сделать это, например, сделать это специфичным для представления предупреждений, а затем сделать его специфичным для другого. Ты знаешь, как я это сделаю? Спасибо!

Ответы [ 5 ]

55 голосов
/ 19 августа 2011

Было бы также технически лучше установить уникальный тег для отдельного UIAlertView и идентифицировать его и получить доступ в методе его делегата.

Например,

    UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Message" message:@"Are You Sure you want to Update?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok",nil];
    [alert setTag:1];
    [alert show];
    [alert release];

    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex  
    {
        if(alertView.tag == 1)
        {
            // set your logic
        }
    }
4 голосов
/ 19 августа 2011

Используйте свойство тега, чтобы уникально идентифицировать каждое из создаваемых предупреждений.

Как это

myAlertView.tag = 1

Затем в методе делегата clickedButtonAtIndex проверьте, какая кнопка оповещения была нажата с использованием этого свойства тега,

if(alertView.tag==1)
2 голосов
/ 19 августа 2011

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

UIAlertView *myAlertType1;
UIAlertView *myAlertType2;

@property (nonatomic, retain) UIAlertView *myAlertType1;
@property (nonatomic, retain) UIAlertView *myAlertType2;

Создайте ваше оповещение, используя эти свойства

self.myAlertType1 = [[[UIAlertView alloc] initWithTitle: ... etc] autorelease];
[self.myAlertType1 show];

Тогда в вашем методе делегата:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (alertView == myAlertType1) {
         // check the button types and add behaviour for this type of alert
    } else if (alertView == myAlertType2 {
         // check the button types and add behaviour for the second type of alert
    }
}

Редактировать: Хотя вышеприведенное работает, предложение iApple об использовании тега выглядит чище / проще.

2 голосов
/ 19 августа 2011

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

Чтобы различать несколько видов предупреждений, вы можете использовать их свойство tag.

1 голос
/ 19 августа 2011
 //in your .h file
  UIAlertView* alert1;
  UIAlertView* alert2;

  //in your .m file
  // when you are showing your alerts, use
  [alert1 show]; //or
  [alert2 show];

  //and just check your alertview in the below method

  - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex  
  {  
       if(alertView == alert1)
       {
              //check its buttons
       }
       else   //check other alert's btns
  }   
...