Mise à jour: De ios10,
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction;
De IOS 7et plus tard UITextView
a la méthode déléguée:
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange *NS_DEPRECATED_IOS(7_0, 10_0, "Use textView:shouldInteractWithURL:inRange:forInteractionType: instead");*
pour intercepter les clics sur les liens. Et c'est la meilleure façon de le faire.
Pour ios6et plus tôt, une bonne façon de le faire est de sous UIApplication
-classer et d'écraser le-(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 devrez mettre openURL:
en œuvre dans votre délégué.
Maintenant, pour que l'application démarre avec votre nouvelle sous-classe de UIApplication
, recherchez le fichier main.m dans votre projet. Dans ce petit fichier qui démarre votre application, il y a généralement cette ligne:
int retVal = UIApplicationMain(argc, argv, nil, nil);
Le troisième paramètre est le nom de classe de votre application. Donc, en remplaçant cette ligne pour:
int retVal = UIApplicationMain(argc, argv, @"MyApplication", nil);
Cela a fait l'affaire pour moi.
UIApplication
et remplacer l'implémentation openURL. Bien que de cette façon, il soit difficile (mais pas impossible) de référencer l'implémentation d'origine.Sous iOS 7 ou version ultérieure
Vous pouvez utiliser la méthode de délégué UITextView suivante:
La vue texte appelle cette méthode si l'utilisateur appuie ou appuie longuement sur le lien URL. La mise en œuvre de cette méthode est facultative. Par défaut, la vue texte ouvre l'application chargée de gérer le type d'URL et lui transmet l'URL. Vous pouvez utiliser cette méthode pour déclencher une autre action, telle que l'affichage du contenu Web à l'URL dans une vue Web de l'application actuelle.
Important:
la source
UIWebView
si vous souhaitez créer un autre texte avec le lien et non l'URL elle-même. La<a>
balise reste la meilleure solution dans ce cas.Pour Swift 3
ou si la cible est> = IOS 10
la source
Avec Swift 5 et iOS 12, vous pouvez utiliser l'un des trois modèles suivants pour interagir avec les liens dans un fichier
UITextView
.#1. Utilisation de
UITextView
ladataDetectorTypes
propriété.Le moyen le plus simple d'interagir avec les numéros de téléphone, les URL ou les adresses dans un
UITextView
est d'utiliser unedataDetectorTypes
propriété. L'exemple de code ci-dessous montre comment l'implémenter. Avec ce code, lorsque l'utilisateur appuie sur le numéro de téléphone, unUIAlertController
message apparaît.# 2. Utilisation de
UITextViewDelegate
latextView(_:shouldInteractWith:in:interaction:)
méthode deSi vous souhaitez effectuer une action personnalisée au lieu de créer une
UIAlertController
fenêtre contextuelle lorsque vous appuyez sur un numéro de téléphone lors de l'utilisationdataDetectorTypes
, vous devez vousUIViewController
conformer auUITextViewDelegate
protocole et à l'implémentertextView(_:shouldInteractWith:in:interaction:)
. Le code ci-dessous montre comment l'implémenter:# 3. Utilisation
NSAttributedString
etNSAttributedString.Key.link
Comme alternative, vous pouvez utiliser
NSAttributedString
et définir unURL
pour sonNSAttributedString.Key.link
attribut. L'exemple de code ci-dessous en montre une implémentation possible. Avec ce code, lorsque l'utilisateur appuie sur la chaîne attribuée, unUIAlertController
message apparaît.la source
Version Swift:
Votre configuration UITextView standard devrait ressembler à quelque chose comme ceci, n'oubliez pas le délégué et les dataDetectorTypes.
À la fin de votre cours, ajoutez cette pièce:
la source
Swift 4:
1) Créez la classe suivante (sous-classée UITextView):
2) Partout où vous configurez votre texte, procédez comme suit:
Si vous utilisez un storyboard, assurez-vous que votre texte ressemble à ceci dans l'inspecteur d'identité du volet droit:
Voila! Maintenant, vous obtenez le lien appuyez immédiatement au lieu de quand l'URL devrait interagir avec la méthode URL
la source
Je n'ai pas essayé cela moi-même, mais vous pouvez essayer d'implémenter la
application:handleOpenURL:
méthode dans votre délégué d'application - il semble que toutes lesopenURL
demandes passent par ce rappel.la source
Je ne sais pas comment vous intercepteriez la liaison de données détectée ou quel type de fonction vous devez exécuter. Mais vous pourrez peut-être utiliser la méthode didBeginEditing TextField pour exécuter un test / scan à travers le champ de texte si vous savez ce que vous recherchez ... comme comparer des chaînes de texte qui correspondent au format ### - ### - ####, ou commencez par "www." pour saisir ces champs, mais vous auriez besoin d'écrire un peu de code pour renifler la chaîne textfields, reconiser ce dont vous avez besoin, puis l'extraire pour l'utilisation de votre fonction. Je ne pense pas que ce serait si difficile, une fois que vous avez défini exactement ce que vous vouliez et que vous avez ensuite concentré vos filtres d'instruction if () sur un modèle de correspondance très spécifique de ce dont vous aviez besoin.
Bien entendu, cela implique que l'utilisateur va toucher la zone de texte pour activer didBeginEditing (). Si ce n'est pas le type d'interaction utilisateur que vous recherchiez, vous pouvez simplement utiliser un déclencheur Timer, qui démarre sur ViewDidAppear () ou autre en fonction des besoins et traverse la chaîne textfields, puis à la fin de vous exécutez la chaîne textfield méthodes que vous avez créées, il vous suffit de désactiver la minuterie.
la source
application:handleOpenURL:
est appelée lorsqu'une autre application ouvre votre application en ouvrant une URL avec un schéma pris en charge par votre application. Il n'est pas appelé lorsque votre application commence à ouvrir une URL.Je pense que la seule façon de faire ce que Vladimir veut est d'utiliser un UIWebView au lieu d'un UITextView. Faites en sorte que votre contrôleur de vue implémente UIWebViewDelegate, définissez le délégué de UIWebView sur le contrôleur de vue et, dans l'implémentation du contrôleur de vue,
webView:shouldStartLoadWithRequest:navigationType:
pour ouvrir[request URL]
dans une vue au lieu de quitter votre application et de l'ouvrir dans Mobile Safari.la source