112 votes

Comment intercepter cliquez sur le lien dans UITextView?

Est-il possible d'effectuer une action personnalisée lorsque l'utilisateur touche autodétecté téléphone lien dans UITextView. Merci de ne pas les conseils d'utilisation UIWebView à la place.

Et merci de ne pas juste répétez le texte à partir d'apple classes de référence - certainement, je l'ai déjà lu.

Merci.

155voto

Felz Points 5989

Mise à jour: à Partir de iOS 7 et les versions Ultérieures UITextView a le délégué de la méthode:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange

pour intercepter les clics des liens. Et c'est la meilleure façon de le faire.

Pour iOS 6 et les versions antérieures, une belle façon de le faire est de subclassing UIApplication et d'écraser l' -(BOOL)openURL:(NSURL *)url

@interface MyApplication : UIApplication {

}

@end

@implementation MyApplication


-(BOOL)openURL:(NSURL *)url{
    if  ([self.delegate openURL:url])
         return YES;
    else
         return [super openURL:url];
}
@end

Vous aurez besoin de mettre en oeuvre openURL: dans votre délégué.

Maintenant, pour avoir le démarrage de l'application avec votre nouvelle sous-classe d' UIApplication, recherchez le fichier principal.m dans votre projet. Dans ce petit fichier qui démarre votre application, il est généralement de cette ligne:

int retVal = UIApplicationMain(argc, argv, nil, nil);

Le troisième paramètre est le nom de la classe pour votre application. Ainsi, le remplacement de cette ligne:

int retVal = UIApplicationMain(argc, argv, @"MyApplication", nil);

Cela a fait l'affaire pour moi.

54voto

Rajan Balana Points 2322

Dans iOS 7 ou version Ultérieure

Vous pouvez utiliser les éléments suivants UITextView délégué de la Méthode:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange

L'affichage de texte appelle cette méthode si l'utilisateur appuie ou long-presses de l'adresse URL du lien. La mise en œuvre de cette méthode est facultative. Par défaut, l'affichage de texte s'ouvre l'application, responsable de traitement, le type d'URL et transmet l'URL. Vous pouvez utiliser cette méthode pour déclencher une action de substitution, telles que l'affichage du contenu web à l'adresse URL dans un affichage web, au sein de l'application en cours.

Important:

Les liens dans le texte des vues interactives, uniquement si le mode texte est sélectionnable mais non modifiable. C'est, si la valeur de la UITextView le choix de la propriété est OUI et le isEditable la propriété n'est PAS.

1voto

application:handleOpenURL: est appelée lorsqu'une autre application s'ouvre votre application par l'ouverture d'une URL avec un schéma de votre application prend en charge. Il n'est pas appelé lorsque votre application commence l'ouverture d'une URL.

Je pense que la seule façon de faire ce que Vladimir veut, c'est d'utiliser une UIWebView au lieu d'un UITextView. Faire de votre point de vue contrôleur de mettre en œuvre UIWebViewDelegate, définir la UIWebView du délégué à la vue du contrôleur, et de l'avis du contrôleur de mettre en oeuvre webView:shouldStartLoadWithRequest:navigationType: d'ouvrir [request URL] dans une vue au lieu de cesser de votre application et de l'ouvrir dans le navigateur Safari Mobile.

0voto

Vladimir Points 110327

Je n'ai pas essayé moi-même, mais vous pouvez essayer de mettre en oeuvre application:handleOpenURL: méthode dans votre application délégué - il ressemble à tous openURL demande de passer par ce rappel.

0voto

Newbyman Points 966

Vous ne savez pas comment vous intercepter la détection de liaison de données, ou quel type de fonction, vous devez exécuter. Mais vous pouvez être en mesure d'utiliser le didBeginEditing TextField méthode pour exécuter un test/analyse par le biais de la zone de texte si vous savez ce que vous cherchez..tels que la comparaison des chaînes de texte qui répondent ###-###-#### format, ou de commencer avec "www." pour récupérer ces champs, mais vous devez écrire un peu de code à renifler, à travers les objets textfield chaîne, reconize ce dont vous avez besoin, puis l'extraire de votre fonction de l'utilisation. Je ne pense pas que ce serait si difficile, une fois que vous avez rétréci vers le bas exactement ce que tu voulais et ensuite porté à votre si() déclaration des effets très spécifiques qui correspondent au motif de ce que vous avez besoin.

De couse cela implique que l'utilisateur va toucher la zone de texte pour activer le didBeginEditing(). Si ce n'est pas le type de l'interaction de l'utilisateur que vous recherchez, vous pouvez simplement utiliser un trigger Timer, qui commence sur ViewDidAppear() ou autre, fondée sur les besoins et les pistes à travers les objets textfield chaîne, puis à la fin de l'exécution à travers la zone de texte chaîne de méthodes que vous avez construit, vous venez de tourner la Minuterie marche arrière.

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