Второй AlertView openURL не работает - PullRequest
1 голос
/ 22 ноября 2011

У меня есть две кнопки оповещения, я не могу заставить вторую кнопку перейти на другой URL, она просто идет по тому же URL, что и первая кнопка.Второе предупреждение появляется без проблем, кнопка «Посетить» во втором предупреждении становится такой же, как и в первом.

-(IBAction)creditBtn: (id) sender{  
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Credits"
                                               message:@"Message
                                               delegate:self 
                                               cancelButtonTitle:@"Cancel"
                                               otherButtonTitles:@"Visit", nil];    

     [alert show];                            
     [alert release];
}                         

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
      if(buttonIndex==1) {
         [[UIApplication sharedApplication] openURL:
                         [NSURL URLWithString:@"http://website1.com"]];
       }
}

-(IBAction)sendBtn: (id) sender2{   
    UIAlertView *alert2 = [[UIAlertView alloc]
                          initWithTitle:@"Send Me Your Feedback" 
                          message:@"Message"
                          delegate:self 
                          cancelButtonTitle:@"Cancel" 
                          otherButtonTitles:@"Visit", nil]; 
    [alert2 show];
    [alert2 release];
}

- (void)alertView2:(UIAlertView *)alertView2 clickedButtonAtIndex:(NSInteger)buttonIndex{
    // resign the shake FirstResponder, no keyboard if not
    //[self resignFirstResponder];
    // making the otherButtonTitles button in the alert open a URL
    if(buttonIndex==0){
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://website2.com"]];
    }
}

1 Ответ

1 голос
/ 25 ноября 2011

Ваша проблема связана с методом делегата alertView2. Делегат - это метод, который автоматически вызывается, когда что-то происходит. В этом случае метод delagate: - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex автоматически вызывается при закрытии UIAlertView. Итак, ваша проблема в том, что ваш alert2 также вызывает тот же метод делегата, что и ваше первое предупреждение.

Но это действительно легко исправить. Чтобы исправить это, мы добавляем тег к каждому alertView. Затем в методе делегата мы проверяем тег, чтобы увидеть, какое это было предупреждение. Вот как это сделать:

//Set up your first alertView like normal:
-(IBAction)creditBtn: (id) sender{  
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Credits" 
                                                message:@"Message"
                                                delegate:self
                                                cancelButtonTitle:@"Cancel"
                                                otherButtonTitles:@"Visit", nil]; 
      alert.tag = 0;    //Here is that tag
      [alert show];                             
      [alert release]; //Although this is unnecessary if you are using iOS 5 & ARC
}

Единственное, что я изменил, я пометил первое предупреждение как предупреждение 0. Это означает, что, если у каждого предупреждения есть свой тег, мы можем увидеть разницу.

Затем настройте ваш второй alertView так же, как вы делали:

-(IBAction)sendBtn:(id)sender{   
    UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle:@"Send Me Your Feedback" 
                          message:@"Message"
                          delegate:self 
                          cancelButtonTitle:@"Cancel" 
                          otherButtonTitles:@"Visit", nil];
    alert.tag = 1;     //Notice I used a different tag number
    [alert show];
    [alert release];
}

Обратите внимание, что я назвал оба alertViews alert. Мне не нужно было называть их alert & alert2, потому что это называется переменной областью действия. Область действия переменных означает, что переменные живут некоторое время, а затем умирают. Так что в вашем случае, потому что вы создали переменную UIAlertView *alert внутри метода, в конце этого метода эта переменная умирает. Для получения дополнительной информации об этом, проверьте это: Статья о переменной области

Затем, наконец, метод делегата, который отвечает на закрытие alertView:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
        if(alert.tag == 0 && buttonIndex == 1)     //Show credits
              [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://website1.com"]];

        else if(alert.tag == 1 && buttonIndex == 1)     //Send feedback
               [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://website2.com"]];
 }

Вот и все. Дайте мне знать в комментарии, если вам нужна дополнительная помощь.

...