Récupérer et lancer une url depuis un UIButton

Bonjour,


Mon appli affiche des objets avec une adresse web (j'utilise le SDK de Parse pour gérer la data)


 


J'utilise actuellement une UITextView pour afficher l'url , de cette manière :


        


    NSMutableString *webText = [NSMutableString string];


    for (NSString* url in [_item objectForKey:@weburl]) {


    [webText appendFormat:@%@\n", url];


    }


            


    self.webTextView.text = webText;


      


    }


 


Je souhaiterais utiliser un UIButton (à  la place de l'UITextView) pour ouvrir l'url dans Safari.


J'ai trouvé une méthode classique qui fonctionne si on connait déjà  l'adresse web à  indiquer, par exemple :


 


- (IBAction)openGoogle:(id)sender


{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.google.com"]];
}


 

J'ai cependant un problème pour récupérer l'url depuis Parse Server. J'écris ceci mais ça ne fonctionne pas :

- (IBAction)URLButtonAction:(id)sender {

   


    NSString *webURL = [_item objectForKey:@weburl];


    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:webURL]];


    


}


 


ça me fait une erreur:


 uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM length]: unrecognized selector sent to instance 0x608000254b20'


 

Quelqu'un aurait une meilleure idée ? Par avance merci 

 

Réponses

  • LarmeLarme Membre
    janvier 2017 modifié #2

    [_item objectForKey:@weburl] est un NSMutableArray, pas un NSString. D'où ton erreur.


     


    En bref, tu dis à  ton code que [_item objectForKey:@weburl] est un NSString. Il te croit sur parole, et quand tu fais UIApplication sharedApplication] openURL:[NSURL URLWithString:webURL, (je suppose que juste [NSURL URLWithString:webURL] causera la même erreur), il appelle la méthode -length de NSString (en interne, le code n'est pas ouvert), et comme c'est en réalité un NSMutableArray et qu'il ne la connait pas, il te sort l'erreur :
    '-[__NSArrayM length]: unrecognized selector sent to instance :


    -[] : Pour te dire que c'est un appel de méthode d'instance


    __NSArrayM : Pour te dire que l'objet sur lequel l'appel est fait est en réalité un NSMutableArray
    length : Pour te dire qu'on a essayé d'appeler length.

    Ici, c'est un peu subtile, car length n'est pas appelé directement par toi, mais de manière cachée par iOS.


     


     


     


    En plus, tu fais :



    for (NSString* url in [_item objectForKey:@weburl]) {
        [webText appendFormat:@%@\n", url];
    }

    Et ça marche, or ici, on devine que c'est un NS(Mutable)Array. Or pourquoi ça serait différent d'une ligne à  une autre ? À moins de faire des trucs bizarres et pas conseillé évidemment.


     


    Quoiqu'il en soit, cette erreur signifie : Tu penses qu'un objet est de telle classe, mais en réalité non.


     


    Solution (possible) :



    NSArray *allURLs = [_item objectForKey:@weburl];
    NSString *firstURLStr = [allURLs firstObject];
     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:allURLs]];

    Bon, après, si t'as 2 URLs, et que tu veux la deuxième...


  • CéroceCéroce Membre, Modérateur
    _item ne contient pas une URL mais un NSArray de NSDictionaries comme on le voit en haut (puisque tu les énumères).
  • merci beaucoup pour ces explications, malgré tout je ne trouve pas encore la solution.


    La proposition de Larme ne fonctionne pas, sinon j'essayais bêtement de faire comme ceci mais le bouton est inactif :


     


    - (IBAction)URLButtonAction:(id)sender {


       


        NSMutableString *webURL = [NSMutableString string];


        for (NSString* url in [_item objectForKey:@weburl]) {


            [webURL appendFormat:@%@\n", url];


        }


        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:webURL]];


        


     


    }

  • NSLog(@[_item objectForKey:@weburl]: %@", [_item objectForKey:@weburl]);


    NSLog(@[_item objectForKey:@weburl] class: %@", [[_item objectForKey:@weburl] class]);


    ça donne quoi ?


  • @Larme :


     


    expected ')' 


    certainement problème de "syntaxe" ? 


  • Ah oui, il faut échapper les guillemets via \" =>


    NSLog(@[_item objectForKey:@\"weburl\"]: %@", [_item objectForKey:@weburl]);

    NSLog(@[_item objectForKey:@\"weburl\"] class: %@", [[_item objectForKey:@weburl] class]);


  • Ok nickel


    ça donne : 


     


    2017-01-10 09:28:25.708 myapp [6699:1611630] [_item objectForKey:@weburl]: (


        "oculus.com"


    )


    2017-01-10 09:28:25.708 myapp [6699:1611630] [_item objectForKey:@weburl] class: __NSArrayM


     

  • J'étais un peu fatigué hier.

    C'était une erreur de ma part:



    NSArray *allURLs = [_item objectForKey:@weburl];
    NSString *firstURLStr = [allURLs firstObject];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:firstURLStr]];
  • yes !! bravo ça marche nickel, encore merci ça fait vraiment plaisir d'avoir de l'aide !


    (et merci à  ce forum d'exister)


Connectez-vous ou Inscrivez-vous pour répondre.