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"]];
}
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'
Réponses
[_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 :
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) :
Bon, après, si t'as 2 URLs, et que tu veux la deuxième...
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:
yes !! bravo ça marche nickel, encore merci ça fait vraiment plaisir d'avoir de l'aide !
(et merci à ce forum d'exister)