Mettre une url dans IB
muqaddar
Administrateur
Salut,
Je cherche à faire un lien sur une URL dans mon interface. Et donc qu'elle soit cliquable et que ça la passe en bleu. Et quand on clique que ça lançe safari avec l'url.
IB, Xcode ou un contrôle AppleScript ?
Merci
Je cherche à faire un lien sur une URL dans mon interface. Et donc qu'elle soit cliquable et que ça la passe en bleu. Et quand on clique que ça lançe safari avec l'url.
IB, Xcode ou un contrôle AppleScript ?
Merci
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Dans ce cas, il suffit de modifier l'attribut de la chaà®ne de caractère qui représente ton URL en positionnant l'attribut NSLinkAttributeName.
Ensuite, il faut implémenter un delegate de ta NSTextView qui sera appelé quand tu cliqueras sur ton URL.
Le delegate est :
Dans le delegate, tu récupères ton URL pour ensuite "l'ouvrir" via la méthode openUrl de la classe NSWorkspace.
Il est aussi possible de stocker dans la valeur de l'attribut NSLinkAttributeName un objet NSUrl contenant ton URL. Dans ce cas, je crois que le delegate n'est pas nécessaire, le système ouvrant de lui même l'URL avec l'application par défaut (mais je n'ai jamais testé cette possibilité).
A noter que peut-être dans la dernière version de IB, tu peux modifier l'attribut NSLinkAttributeName dans le texte de ta NSView. Sinon, il faut le faire par programme.
.
-(void)urlAttributes {
NSString *chaineLue = [urlClicable value];
NSMutableAttributedString *url;
url = [[NSMutableAttributedString alloc] initWithString: chaineLue];
[url addAttribute: NSLinkAttributeName value:(id)value range:(NSRange)aRange];
[urlClicable setAttributedStringValue:url];
}
Mais je ne sais que mettre ds la 4è ligne.... [url addAttribute....[/url]
The link attribute specifies an arbitrary object that is passed to the NSTextView method clickedOnLink:atIndex: when the user clicks in the text range associated with the NSLinkAttributeName attribute. The text view?s delegate object can implement textView:clickedOnLink:atIndex: or textView:clickedOnLink: to process the link object. Otherwise, the default implementation checks whether the link object is an NSURL and, if so, opens it in the URL?s default application.
Moi, c'est un NSTextField aussi...
Pour pas compliquer, teste peut-être dans un premier temps dans un textView qui gère tout ça très bien ...
Je crois que tu dois passer dans value un NSURL que tu dois pouvoir obtenir avec:
texteURL nous vient du binding sur le NSTextField, seulement, je me fais jeter :
*** Uncaught exception: <NSInvalidArgumentException> *** -[NSConstantString stringValue]: selector not recognized
Je peux pas faire de stringValue apparemment, mais pourquoi ?
J'suis encore au boulot et j'en proffite pour te répondre.
Décidemment les NSTransformers ont la cote en ce momment
Pour ton pb, quelle est la nature de l'objet texteURL passé à ton transformer ?
Si c'est bien comme ton message d'erreur le dit, c'est une NSString déja.
NSString n'a pas de méthode stringValue ;D
essaies donc tout simplement ça:
@+
[EDIT] et bien sur enlèves la ligne: 8)
ça doit pas être la bonne méthode pour créer un hyperlien.
NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.foo.com";
ça lance l'url tout de suite... dommage
Autrement dit ton transformer a converti une chaine en URL que le TextField converti dans la foulée en NSString !!! ;D
L'hyperlien ne s'affichera qu'avec une NSAttibutedString.
Essaies la même chose avec une NSTextView, si ça marche, on réfléchira à comment obliger un NSTextField a agir de même.
Par ailleurs, je comprends pas que ce soit si dur de transformer uen chaà®ne en url, qd je pense à tous les sharewares qui ont leur signature et leur site dans "A propos"... :crackboom:-
L'erreur qd je binde le data :
2004-09-14 18:49:57.814 webmasterMemory[13560] Cannot create NSData from object <_NSControllerObjectProxy: 0x361ae0> of class _NSControllerObjectProxy
une NSTextView attend une NSData ;D
Il faut que ton transformer créer l'Url, la transforme en NSAttribute String qu'elle transforme ensuite en NSData...
A la réflexion, c'est vrai que c'est assez coton, surtout si tu veux insérer ton lien dans un texte existant ... :-\
Dans IB, j'utilise une textview (celui qui contient le texte "lorem ipsum dolor..." dans la palette de IB). Dans l'exemple, je mets le texte "Merci au site Objective-Cocoa.". Ensuite je lie cette textview à un outlet (dans l'exemple, cet outlet se nomme tv).
Enfin dans le awakeFromNib du controleur, je fais ça :
.
J'ai 2 questions néanmoins.
1) on peut mettre quoi comme valeurs dans NSMakeRange pour que ça crée l'url sur tous les caractères ou sur aucun (voilà le genre de chose qu'on trouve pas ds la doc apple... ?)
2) mon outlet tv prendra une valeur qui provient d'un dico : mondico.mavaleur or un NSTextView gère les NSData et uniquement ça non ? Donc, comment lui faire avaler mon NSData, qui plus est en binding, et que ça marche aussi ? Si la fonction est ds le awakeFromNib, ça marchera aussi avec une valeur non fixe à la place de @"http://www.objective-cocoa.org" ?
http://www.cocoadev.com/index.pl?ClickableUrlInTextView
Réponse : NSMakeRange(0, [[tv textStorage] length])
Je ne vois pas à quoi ça peut servir...
Une NSTextView ne gère que l'affichage d'un texte... Le texte lui-même est stocké dans une NSTextStorage.
Ton texte est dans une NSData ? alors essaie quelque chose comme ça :
[tt]
NSString *s;
NSAttributedString *as;
s=[NSString alloc] initWithData:ma_data encoding:NSUTF8StringEncoding autorelease];
as=[[[NSAttributedString alloc] initWithString:s] autorelease];
[[tv textStorage] setAttributedString:as];
[/tt]
Oui, tu peux mettre ce que tu veux comme url du moment que ce soit un objet NSString qui contient l'url.
J'ai pas compris toutes les questions, aussi n'hésite pas à détailler ce que tu veux vraiment faire...
.
Mon pb général est de placer ton code dans une méthode qui serait appelée quand je tape mon texte dans le NSTextView, et que ça crée le lien avec la bonne url (donc celle du texte tapé au fur et à mesure).
Merci.
Plus simple serait de faire un menu contextuel permettant de créer une url à partir de la sélection.
la méthode textDidEndEditing férifie s'il s'agit d'une URL valide et, si c'est la cas met en place le lien.
Dans ce cas, le code dans le lien que tu as fourni vers cocoadev est exactement ce qu'il te faut. Et comme mpergand le suggère, tu appelles la méthode de cocoadev dans le délégué qui va bien.
.
J'ai d'abord défini mon AppControlleur comme delegate de File's owner. Ensuite, j'ai défini mon AppControlleur comme delegate de mon textView.
Et j'ai ajouté ceci dans mon contrôleur :
Mon texte passe en lien clicable uniquement si http:// est tapé et quand je textView n'est plus FirstResponder. Y'a un petit soucis si j'efface mon texte ensuite et qu'il reste "htt" par exemple, ça reste une url...
Sinon, mon autre pb est de binder convenablement ce textView puisque tout ce qui marche dans IB pour textField ne marche pas pour textView. Je demande donc au bindingologue, si je dois créer un transformer pour textStorage ou autre ?
PS : IB vient de me planter 4 fois et a fini par corrompre mon nib qui ne faisait plus que 8 Ko au lieu de 64... J'ai repris l'ancien nib...
Au moment de sa sauvegarde le NSArray recevra un NSData en provenance du textStorage et le tout sera sauvegardé.
De même si c'est pour en sauvegarder le contenu dans les préférences via le NSUserDefaultsController.
Par contre si tu dois lire directement le contenu sur disque, il te faudra un NSUnarchiveFromData.
Néanmoins, sii t'as un pb, n'hésites pas, je m'y pencherais de plus prèsÂ
La textView devrait être liée à une clé de dictionnaire et non de tableau : dicWebsites.name en l'occurence.
En bindant directement, il em dit que ma classe n'est plus KVCompliant.
:-) :rose!:
- Ne pas oublier d'enlever le vérificateur d'orthographe dans IB :-)
- Quand je relance le prog, l'url n'est plus clicable, il faut aller ds son champ et cliquer ailleurs, normal, avec la méthode textDidEndEditing... j'ai pensé faire un appel à la méthode qui crée l'url ds awakeFromNib, mais ça ne marche pas terrible.
[self hiliteAndActivateURLs:websiteURL];
Une suggestion ?