Zweite AlertView openURL funktioniert nicht

  • Ich habe zwei Benachrichtigungsschaltflächen. Ich kann die zweite Schaltfläche nicht dazu bringen, zu einer anderen URL zu wechseln. Sie wird nur an dieselbe URL wie die erste Schaltfläche weitergeleitet. Die zweite Warnmeldung wird ohne Probleme angezeigt. Die Schaltfläche "Besuch" der zweiten Warnmeldung ist identisch mit der ersten.

     -(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"]];
        }
    }
     
    25 November 2011
    AnnaPavel Oleinic
1 answer
  • Ihr Problem liegt bei der Delegatenmethode alertView2. Ein Delegat ist eine Methode, die automatisch aufgerufen wird, wenn etwas passiert. In diesem Fall wird die delagate methood: - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex automatisch aufgerufen, wenn ein UIAlertView geschlossen wird. Ihr Problem ist also, dass Ihre alert2 auch dieselbe Delegat-Methode wie Ihre erste Warnung aufruft.

    Es gibt jedoch eine wirklich einfache Lösung. Um dies zu beheben, fügen wir jeder alertView ein Tag hinzu. In der Delegat-Methode überprüfen wir das Tag, um herauszufinden, um welche Warnung es sich handelt. So gehen Sie vor:

     //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
    }
     

    Das einzige, was ich geändert habe, ist, dass ich die erste Warnung als Warnung 0 gekennzeichnet habe Was dies bedeutet, solange jede Warnung ein anderes Tag hat, können wir den Unterschied erkennen.

    Richten Sie dann Ihre zweite alertView so ein, wie Sie es getan haben:

     -(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];
    }
     

    Hinweis Ich nannte beide alertViews alert. Ich musste sie nicht nennen alert & amp; alert2 weil diese Sache als variable Gültigkeit bezeichnet wurde. Variabler Geltungsbereich bedeutet, dass Variablen eine bestimmte Zeit lang leben und dann sterben. In Ihrem Fall also, weil Sie die Variable UIAlertView *alert innerhalb einer Methode erstellt haben. Am Ende dieser Methode stirbt diese Variable. Weitere Informationen hierzu finden Sie hier: Artikel über den Variablenumfang

    Anschließend die Delegat-Methode, die auf das Schließen der alertView reagiert:

     - (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"]];
     }
     

    Das ist alles, was dazu gehört. Lassen Sie mich in einem Kommentar wissen, wenn Sie weitere Hilfe benötigen.

    25 November 2011
    Andrew