71 votes

UILabel - chaîne, comme le texte et les liens

J'ai un UILabel dont le texte que j'obtiens à partir d'un serveur. Une partie du texte est d'être identifiés comme des liens, et sur de toucher ces liens, certaines mesures doivent être effectuées. par exemple

NSString *str = @"Mon numéro de téléphone est 645-345-2345 et mon adresse est xyz";

C'est le texte complet de UILabel. Je n'ai qu'un UILabel pour l'affichage de ce texte (le Texte est dynamique. J'ai juste donné un exemple.). En cliquant sur ces liens, j'ai besoin d'exécuter des actions telles que la navigation de quelques différentes écran ou faites un appel.
Je sais que je peux afficher ce texte avec l'aide de OHAttributedLabel. Et les liens peuvent être affichées comme suit :

[label1 addCustomLink:[NSURL URLWithString:@"http://www.foodreporter.net"] inRange:[txt rangeOfString:someString]];  

Mais je me demande comment puis-je faire de ces liens de texte d'effectuer certaines actions, comme la navigation à l'écran ou de faire un appel.
Permettez-moi de savoir si plus d'explication est nécessaire.

130voto

djromero Points 11713

Vous pouvez ajouter des actions personnalisées pour n'importe quelle UILabel remplacements que les liens de support à l'aide d'un faux schéma d'URL que vous aurez intercepter plus tard:

TTTAttributedLabel *tttLabel = <# create the label here #>;
NSString *labelText = @"Lost? Learn more.";
tttLabel.text = labelText;
NSRange r = [labelText rangeOfString:@"Learn more"]; 
[tttLabel addLinkToURL:[NSURL URLWithString:@"action://show-help"] withRange:r];

Puis, dans votre TTTAttributedLabelDelegate:

- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url {
    if ([[url scheme] hasPrefix:@"action"]) {
        if ([[url host] hasPrefix:@"show-help"]) {
            /* load help screen */
        } else if ([[url host] hasPrefix:@"show-settings"]) {
            /* load settings screen */
        }
    } else {
        /* deal with http links here */
    }
}

TTTAttributedLabel est un fork de OHAttributedLabel.

Si vous souhaitez une approche plus complexe, jetez un oeil à Nimbus Attribué l'Étiquette. Il soutien personnalisé liens out-of-the-box.

17voto

Ganesh Points 569

Vous pouvez utiliser UITextView avec les numéros de Téléphone et liens de détection OUI, le défilement personnes handicapées OUI interaction de l'utilisateur activé OUI, au lieu de UILabel.

8voto

Martin Gjaldbaek Points 1396

Mon projet a utilisé avec succès OHAttributedLabel pour cela. Découvrez l'

-(BOOL)attributedLabel:(OHAttributedLabel*)attributedLabel shouldFollowLink:(NSTextCheckingResult*)linkInfo;

méthode en OHAttributedLabelDelegate (lien). Il vous permet de décider ce qui se passe lorsque le lien est cliqué. Si vous regardez le code source de l'exemple de la OHAttributedLabel projet, il est utilisé pour afficher un message d'alerte. Si vous avez retourné NO dans ce cas (pour garder l'action par défaut de passe trop), vous pouvez simplement faire ce que vous vouliez comme la navigation, etc.

Notez cependant que cela nécessite que vous pouvez déterminer l'action correctement, juste du texte. Pour notre projet, nous avons utilisé un peu plus sophistiqué de solution, où le serveur nous a envoyé le texte avec des balises et une liste de commandes à exécuter pour chaque balise.

6voto

adamsiton Points 2003

Il y a un projet appelé FancyLabel qu'est-ce que vous avez besoin. Il pourrait avoir besoin d'un certain degré de personnalisation. Aussi, je pense que Three20 dispose de cette fonctionnalité, mais c'est peut-être trop si vous n'utilisez pas encore.

Il y a aussi une solution beaucoup plus simple, si tous vos liens sont les téléphones \ adresses \ url. Vous pouvez tout simplement utiliser un UITextView au lieu d'un UILabel. Il dispose d'une détection automatique de téléphones, adresse, etc. (il suffit de cocher les cases de l'IB)

Vous pouvez aussi avoir des actions personnalisées en réponse à des événements de clic sur ces liens, en substituant openURL, comme expliqué ici

Est-il une raison spécifique que vous devez utiliser un UILabel au lieu d'un UITextView? Notez que beaucoup de la mise en œuvre des étiquettes attribuées hériter de UIView ou de ne pas mettre en œuvre l'ensemble de UILabel sa fonctionnalité.

3voto

Omid Hashemi Points 132

Voici un joli contrôle, espérons que cela résout votre problème :)

Open Source iOS de Contrôle: UILabel Remplacement Individuel de Mots Cliquables

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X