第二个AlertView openURL不起作用

时间:2011-11-21 22:52:11

标签: ios uialertview

我有两个警报按钮,我无法获得第二个按钮转到另一个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 个答案:

答案 0 :(得分:1)

您的问题在于alertView2委托方法。委托是一种在发生事件时自动调用的方法。在这种情况下,当UIAlertView关闭时,会自动调用delagate methood:- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex。所以你的问题是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,在该方法结束时,该变量就会死掉。有关详细信息,请查看:Article on Variable Scope

最后,响应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"]];
 }

这就是它的全部内容。如果您需要更多帮助,请在评论中告诉我。