Comment puis-je créer un lien cliquable dans une chaîne NSAtsortingbuted?

Il est sortingvial de rendre les hyperliens cliquables dans un UITextView . Vous définissez simplement la case à cocher “détecter les liens” sur la vue dans IB, et il détecte les liens HTTP et les transforme en hyperliens.

Cependant, cela signifie toujours que ce que l’utilisateur voit est le lien “brut”. Les fichiers RTF et HTML vous permettent de configurer une chaîne lisible par l’utilisateur avec un lien “derrière”.

Il est facile d’installer du texte atsortingbué dans une vue texte (ou un UILabel ou UITextField , d’ailleurs). Cependant, lorsque ce texte atsortingbué inclut un lien, il ne peut pas être cliqué.

Existe-t-il un moyen de rendre le texte lisible par l’utilisateur cliquable dans UITextView , UILabel ou UITextField ?

Le balisage est différent sur SO, mais voici l’idée générale. Ce que je veux, c’est un texte comme celui-ci:

Ce morph a été généré avec Face Dancer , Cliquez pour afficher dans l’App Store.

La seule chose que je peux obtenir est la suivante:

Ce morph a été généré avec Face Dancer, cliquez sur http://example.com/facedancer pour l’afficher dans l’App Store.

    Utilisez NSMutableAtsortingbutedSsortingng .

     NSMutableAtsortingbutedSsortingng * str = [[NSMutableAtsortingbutedSsortingng alloc] initWithSsortingng:@"Google"]; [str addAtsortingbute: NSLinkAtsortingbuteName value: @"http://www.google.com" range: NSMakeRange(0, str.length)]; yourTextView.atsortingbutedText = str; 

    Modifier :

    Il ne s’agit pas directement de la question, mais pour clarifier, UITextField et UILabel ne prennent pas en charge les URL d’ouverture. Si vous souhaitez utiliser UILabel avec des liens, vous pouvez vérifier TTTAtsortingbutedLabel .

    Vous devez également définir la valeur dataDetectorTypes de votre UITextView sur UIDataDetectorTypeLink ou UIDataDetectorTypeAll pour ouvrir les URL lorsque vous cliquez dessus. Ou vous pouvez utiliser la méthode des delegates comme suggéré dans les commentaires.

    J’ai trouvé cela très utile, mais je devais le faire dans de nombreux endroits, donc j’ai intégré mon approche dans une simple extension à NSMutableAtsortingbutedSsortingng :

    Swift 3

     extension NSMutableAtsortingbutedSsortingng { public func setAsLink(textToFind:Ssortingng, linkURL:Ssortingng) -> Bool { let foundRange = self.mutableSsortingng.range(of: textToFind) if foundRange.location != NSNotFound { self.addAtsortingbute(.link, value: linkURL, range: foundRange) return true } return false } } 

    Swift 2

     import Foundation extension NSMutableAtsortingbutedSsortingng { public func setAsLink(textToFind:Ssortingng, linkURL:Ssortingng) -> Bool { let foundRange = self.mutableSsortingng.rangeOfSsortingng(textToFind) if foundRange.location != NSNotFound { self.addAtsortingbute(NSLinkAtsortingbuteName, value: linkURL, range: foundRange) return true } return false } } 

    Exemple d’utilisation:

     let atsortingbutedSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng:"I love stackoverflow!") let linkWasSet = atsortingbutedSsortingng.setAsLink("stackoverflow", linkURL: "http://stackoverflow.com") if linkWasSet { // adjust more atsortingbutedSsortingng properties } 

    Objectif c

    Je viens juste de répondre à une exigence pour faire la même chose dans un projet purement Objective-C, alors voici la catégorie Objective-C.

     @interface NSMutableAtsortingbutedSsortingng (SetAsLinkSupport) - (BOOL)setAsLink:(NSSsortingng*)textToFind linkURL:(NSSsortingng*)linkURL; @end @implementation NSMutableAtsortingbutedSsortingng (SetAsLinkSupport) - (BOOL)setAsLink:(NSSsortingng*)textToFind linkURL:(NSSsortingng*)linkURL { NSRange foundRange = [self.mutableSsortingng rangeOfSsortingng:textToFind]; if (foundRange.location != NSNotFound) { [self addAtsortingbute:NSLinkAtsortingbuteName value:linkURL range:foundRange]; return YES; } return NO; } @end 

    Exemple d’utilisation:

     NSMutableAtsortingbutedSsortingng *atsortingbutedSsortingng = [[NSMutableAtsortingbutedSsortingng alloc] initWithSsortingng:"I love stackoverflow!"]; BOOL linkWasSet = [atsortingbutedSsortingng setAsLink:@"stackoverflow" linkURL:@"http://stackoverflow.com"]; if (linkWasSet) { // adjust more atsortingbutedSsortingng properties } 

    Amélioration mineure de la solution de ujell: si vous utilisez NSURL au lieu de NSSsortingng, vous pouvez utiliser n’importe quelle URL (par exemple, des URL personnalisées)

     NSURL *URL = [NSURL URLWithSsortingng: @"whatsapp://app"]; NSMutableAtsortingbutedSsortingng * str = [[NSMutableAtsortingbutedSsortingng alloc] initWithSsortingng:@"start Whatsapp"]; [str addAtsortingbute: NSLinkAtsortingbuteName value:URL range: NSMakeRange(0, str.length)]; yourTextField.atsortingbutedText = str; 

    S’amuser!

    Je viens de créer une sous-classe de UILabel pour traiter spécialement de tels cas d’utilisation. Vous pouvez facilement append plusieurs liens et définir différents gestionnaires pour eux. Il prend également en charge la mise en évidence du lien enfoncé lorsque vous touchez pour le retour tactile. Veuillez vous référer à https://github.com/null09264/FRHyperLabel .

    Dans votre cas, le code peut ressembler à ceci:

     FRHyperLabel *label = [FRHyperLabel new]; NSSsortingng *ssortingng = @"This morph was generated with Face Dancer, Click to view in the app store."; NSDictionary *atsortingbutes = @{NSFontAtsortingbuteName: [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]}; label.atsortingbutedText = [[NSAtsortingbutedSsortingng alloc]initWithSsortingng:ssortingng atsortingbutes:atsortingbutes]; [label setLinkForSubssortingng:@"Face Dancer" withLinkHandler:^(FRHyperLabel *label, NSSsortingng *subssortingng){ [[UIApplication sharedApplication] openURL:aURL]; }]; 

    Exemple de capture d’écran (le gestionnaire est configuré pour afficher une alerte au lieu d’ouvrir une URL dans ce cas)

    face à face

    J’avais moi aussi une exigence similaire. Au début, j’ai utilisé UILabel, puis j’ai réalisé que UITextView était mieux. J’ai fait en sorte que UITextView se comporte comme UILabel en désactivant l’interaction et le défilement et a créé une méthode de catégorie pour que NSMutableAtsortingbutedSsortingng définisse le lien avec le texte comme ce que Karl avait fait (+1 pour cela).

     -(void)setTextAsLink:(NSSsortingng*) textToFind withLinkURL:(NSSsortingng*) url { NSRange range = [self.mutableSsortingng rangeOfSsortingng:textToFind options:NSCaseInsensitiveSearch]; if (range.location != NSNotFound) { [self addAtsortingbute:NSLinkAtsortingbuteName value:url range:range]; [self addAtsortingbute:NSForegroundColorAtsortingbuteName value:[UIColor URLColor] range:range]; } } 

    vous pouvez utiliser le délégué ci-dessous pour gérer l’action

     - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)url inRange:(NSRange)characterRange { // do the task return YES; } 

    Utilisez UITextView pour prendre en charge les liens cliquables. Créer une chaîne atsortingbuée en utilisant le code suivant

     NSMutableAtsortingbutedSsortingng *atsortingbutedSsortingng = [[NSMutableAtsortingbutedSsortingng alloc] initWithSsortingng:strSomeTextWithLinks]; 

    Ensuite, définissez le texte UITextView comme suit

     NSDictionary *linkAtsortingbutes = @{NSForegroundColorAtsortingbuteName: [UIColor redColor], NSUnderlineColorAtsortingbuteName: [UIColor blueColor], NSUnderlineStyleAtsortingbuteName: @(NSUnderlinePatternSolid)}; customTextView.linkTextAtsortingbutes = linkAtsortingbutes; // customizes the appearance of links textView.atsortingbutedText = atsortingbutedSsortingng; 

    Assurez-vous que vous activez le comportement “sélectionnable” du UITextView dans XIB.

    Le cœur de ma question était que je voulais pouvoir créer des liens cliquables dans les vues de texte / champs / étiquettes sans avoir à écrire un code personnalisé pour manipuler le texte et append les liens. Je voulais qu’il soit piloté par les données.

    J’ai finalement compris comment le faire. Le problème est que IB n’honore pas les liens intégrés.

    De plus, la version iOS de NSAtsortingbutedSsortingng ne vous permet pas d’initialiser une chaîne atsortingbuée à partir d’un fichier RTF. La version OS X de NSAtsortingbutedSsortingng comporte un initialiseur qui prend un fichier RTF en entrée.

    NSAtsortingbutedSsortingng est conforme au protocole NSCoding, vous pouvez donc le convertir vers / depuis NSData

    J’ai créé un outil de ligne de commande OS X qui prend un fichier RTF en entrée et génère un fichier avec l’extension .data contenant les données NSData de NSCoding. J’ai ensuite mis le fichier .data dans mon projet et ajouté quelques lignes de code qui chargent le texte dans la vue. Le code ressemble à ceci (ce projet était dans Swift):

     /* If we can load a file called "Dates.data" from the bundle and convert it to an atsortingbuted ssortingng, install it in the dates field. The contents contain clickable links with custom URLS to select each date. */ if let datesPath = NSBundle.mainBundle().pathForResource("Dates", ofType: "data"), let datesSsortingng = NSKeyedUnarchiver.unarchiveObjectWithFile(datesPath) as? NSAtsortingbutedSsortingng { datesField.atsortingbutedText = datesSsortingng } 

    Pour les applications qui utilisent beaucoup de texte formaté, je crée une règle de construction qui indique à Xcode que tous les fichiers .rtf d’un dossier donné sont des fichiers source et que les fichiers .data sont la sortie. Une fois cela fait, j’ajoute simplement des fichiers .rtf au répertoire désigné (ou modifie des fichiers existants) et le processus de génération constate qu’ils sont nouveaux / mis à jour, exécute l’outil de ligne de commande et copie les fichiers dans le groupe d’applications. Cela fonctionne magnifiquement.

    J’ai écrit un article de blog qui renvoie à un exemple de projet (Swift) démontrant la technique. Tu peux le voir ici:

    Création d’URL cliquables dans un UITextField ouvert dans votre application

    Swift 3 exemple pour détecter les actions sur les taps de texte atsortingbués

    https://stackoverflow.com/a/44226491/5516830

     let termsAndConditionsURL = TERMS_CONDITIONS_URL; let privacyURL = PRIVACY_URL; override func viewDidLoad() { super.viewDidLoad() self.txtView.delegate = self let str = "By continuing, you accept the Terms of use and Privacy policy" let atsortingbutedSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: str) var foundRange = atsortingbutedSsortingng.mutableSsortingng.range(of: "Terms of use") //mention the parts of the atsortingbuted text you want to tap and get an custom action atsortingbutedSsortingng.addAtsortingbute(NSLinkAtsortingbuteName, value: termsAndConditionsURL, range: foundRange) foundRange = atsortingbutedSsortingng.mutableSsortingng.range(of: "Privacy policy") atsortingbutedSsortingng.addAtsortingbute(NSLinkAtsortingbuteName, value: privacyURL, range: foundRange) txtView.atsortingbutedText = atsortingbutedSsortingng } func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool { let storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = storyboard.instantiateViewController(withIdentifier: "WebView") as! SKWebViewController if (URL.absoluteSsortingng == termsAndConditionsURL) { vc.strWebURL = TERMS_CONDITIONS_URL self.navigationController?.pushViewController(vc, animated: true) } else if (URL.absoluteSsortingng == privacyURL) { vc.strWebURL = PRIVACY_URL self.navigationController?.pushViewController(vc, animated: true) } return false } 

    De même, vous pouvez append une action de votre shouldInteractWith URL avec la méthode shouldInteractWith URL UITextFieldDelegate.

    À votre santé!!

    Swift 4:

     var ssortingng = "Google" var atsortingbutedSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: ssortingng, atsortingbutes:[NSAtsortingbutedSsortingngKey.link: URL(ssortingng: "http://www.google.com")!]) yourTextView.atsortingbutedText = atsortingbutedSsortingng 

    Swift 3.1:

     var ssortingng = "Google" var atsortingbutedSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: ssortingng, atsortingbutes:[NSLinkAtsortingbuteName: URL(ssortingng: "http://www.google.com")!]) yourTextView.atsortingbutedText = atsortingbutedSsortingng 

    J’ai écrit une méthode qui ajoute un lien (linkSsortingng) à une chaîne (fullSsortingng) avec une certaine URL (urlSsortingng):

     - (NSAtsortingbutedSsortingng *)linkedSsortingngFromFullSsortingng:(NSSsortingng *)fullSsortingng withLinkSsortingng:(NSSsortingng *)linkSsortingng andUrlSsortingng:(NSSsortingng *)urlSsortingng { NSRange range = [fullSsortingng rangeOfSsortingng:linkSsortingng options:NSLiteralSearch]; NSMutableAtsortingbutedSsortingng *str = [[NSMutableAtsortingbutedSsortingng alloc] initWithSsortingng:fullSsortingng]; NSMutableParagraphStyle *paragraphStyle = NSMutableParagraphStyle.new; paragraphStyle.alignment = NSTextAlignmentCenter; NSDictionary *atsortingbutes = @{NSForegroundColorAtsortingbuteName:RGB(0x999999), NSFontAtsortingbuteName:[UIFont fontWithName:@"HelveticaNeue-Light" size:10], NSParagraphStyleAtsortingbuteName:paragraphStyle}; [str addAtsortingbutes:atsortingbutes range:NSMakeRange(0, [str length])]; [str addAtsortingbute: NSLinkAtsortingbuteName value:urlSsortingng range:range]; return str; } 

    Vous devriez l’appeler comme ceci:

     NSSsortingng *fullSsortingng = @"A man who bought the Google.com domain name for $12 and owned it for about a minute has been rewarded by Google for uncovering the flaw."; NSSsortingng *linkSsortingng = @"Google.com"; NSSsortingng *urlSsortingng = @"http://www.google.com"; _youTextView.atsortingbutedText = [self linkedSsortingngFromFullSsortingng:fullSsortingng withLinkSsortingng:linkSsortingng andUrlSsortingng:urlSsortingng]; 

    Il suffit de trouver une solution sans code pour UITextView: entrer la description de l'image ici

    Activer les options Détection-> Liens, l’URL et le courrier électronique seront détectés et cliquables!

    Mettre à jour:

    Il y avait 2 parties clés à ma question:

    1. Comment créer un lien où le texte affiché pour le lien cliquable est différent du lien réel appelé:
    2. Comment configurer les liens sans avoir à utiliser du code personnalisé pour définir les atsortingbuts du texte.

    Il s’avère NSData 7 a ajouté la possibilité de charger du texte atsortingbué à partir de NSData .

    J’ai créé une sous-classe personnalisée de UITextView qui tire parti de l’atsortingbut @IBInspectable et vous permet de charger le contenu à partir d’un fichier RTF directement dans IB. Vous tapez simplement le nom du fichier dans IB et la classe personnalisée fait le rest.

    Voici les détails:

    Dans iOS 7, NSAtsortingbutedSsortingng obtenu la méthode initWithData:options:documentAtsortingbutes:error: Cette méthode vous permet de charger un NSAtsortingbutedSsortingng à partir d’un object NSData. Vous pouvez d’abord charger un fichier RTF dans NSData, puis utiliser initWithData:options:documentAtsortingbutes:error: pour charger ce NSData dans votre vue texte. (Notez qu’il existe également une méthode initWithFileURL:options:documentAtsortingbutes:error: qui chargera une chaîne atsortingbuée directement à partir d’un fichier, mais cette méthode est obsolète dans iOS 9. Il est plus sûr d’utiliser la méthode initWithData:options:documentAtsortingbutes:error: , qui n’était pas obsolète.

    Je voulais une méthode qui me permette d’installer des liens cliquables dans mes vues texte sans avoir à créer de code spécifique aux liens que j’utilisais.

    La solution que j’ai trouvée consistait à créer une sous-classe personnalisée de UITextView que j’appelle RTF_UITextView et à lui atsortingbuer une propriété RTF_Filename appelée RTF_Filename . En ajoutant l’atsortingbut @IBInspectable à une propriété, Interface Builder expose cette propriété dans l’inspecteur “Atsortingbuts”. Vous pouvez ensuite définir cette valeur à partir de IB sans code personnalisé.

    J’ai également ajouté un atsortingbut @IBDesignable à ma classe personnalisée. L’atsortingbut @IBDesignable indique à Xcode qu’il doit installer une copie en cours de votre classe de vue personnalisée dans le générateur Interface afin que vous puissiez le voir dans l’affichage graphique de votre hiérarchie de vues. () Malheureusement, pour cette classe, la propriété @IBDesignable semble être floue. Cela a fonctionné lorsque je l’ai ajouté pour la première fois, mais j’ai ensuite supprimé le contenu en texte brut de ma vue texte et les liens cliquables à mon avis ont disparu et je n’ai pas pu les récupérer.

    Le code de mon RTF_UITextView est très simple. Outre l’ajout de l’atsortingbut @IBDesignable et d’une propriété RTF_Filename avec l’atsortingbut @IBInspectable , j’ai ajouté une méthode didSet() à la propriété RTF_Filename . La méthode didSet() est appelée à tout moment lorsque la valeur de la propriété RTF_Filename . Le code de la méthode didSet() est assez simple:

     @IBDesignable class RTF_UITextView: UITextView { @IBInspectable var RTF_Filename: Ssortingng? { didSet(newValue) { //If the RTF_Filename is nil or the empty ssortingng, don't do anything if ((RTF_Filename ?? "").isEmpty) { return } //Use optional binding to try to get an URL to the //specified filename in the app bundle. If that succeeds, try to load //NSData from the file. if let fileURL = NSBundle.mainBundle().URLForResource(RTF_Filename, withExtension: "rtf"), //If the fileURL loads, also try to load NSData from the URL. let theData = NSData(contentsOfURL: fileURL) { var aSsortingng:NSAtsortingbutedSsortingng do { //Try to load an NSAtsortingbutedSsortingng from the data try aSsortingng = NSAtsortingbutedSsortingng(data: theData, options: [:], documentAtsortingbutes: nil ) //If it succeeds, install the atsortingbuted ssortingng into the field. self.atsortingbutedText = aSsortingng; } catch { print("Nerp."); } } } } } 

    Notez que si la propriété @IBDesignable ne vous permet pas de prévisualiser votre texte stylé de manière fiable dans le générateur Interface, il peut être préférable de définir le code ci-dessus comme une extension de UITextView plutôt qu’une sous-classe personnalisée. De cette façon, vous pouvez l’utiliser dans n’importe quelle vue de texte sans avoir à modifier la vue de texte pour la classe personnalisée.

    Voir mon autre réponse si vous avez besoin de supporter les versions iOS antérieures à iOS 7.

    Vous pouvez télécharger un exemple de projet incluant cette nouvelle classe de gitHub:

    Projet de démonstration de DatesInSwift sur Github

    Version rapide:

      // Atsortingbuted Ssortingng for Label let plainText = "Apkia" let styledText = NSMutableAtsortingbutedSsortingng(ssortingng: plainText) // Set Atsortingbuets for Color, HyperLink and Font Size let atsortingbutes = [NSFontAtsortingbuteName: UIFont.systemFontOfSize(14.0), NSLinkAtsortingbuteName:NSURL(ssortingng: "http://apkia.com/")!, NSForegroundColorAtsortingbuteName: UIColor.blueColor()] styledText.setAtsortingbutes(atsortingbutes, range: NSMakeRange(0, plainText.characters.count)) registerLabel.atsortingbutedText = styledText 

    Je devais continuer à utiliser un UILabel pur, appelé ainsi à partir de mon outil de reconnaissance de taps (ceci est basé sur la réponse de malex ici: Index de caractères au sharepoint contact pour UILabel )

     UILabel* label = (UILabel*)gesture.view; CGPoint tapLocation = [gesture locationInView:label]; // create atsortingbuted ssortingng with paragraph style from label NSMutableAtsortingbutedSsortingng* attr = [label.atsortingbutedText mutableCopy]; NSMutableParagraphStyle* paragraphStyle = [NSMutableParagraphStyle new]; paragraphStyle.alignment = label.textAlignment; [attr addAtsortingbute:NSParagraphStyleAtsortingbuteName value:paragraphStyle range:NSMakeRange(0, label.atsortingbutedText.length)]; // init text storage NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAtsortingbutedSsortingng:attr]; NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; [textStorage addLayoutManager:layoutManager]; // init text container NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(label.frame.size.width, label.frame.size.height+100) ]; textContainer.lineFragmentPadding = 0; textContainer.maximumNumberOfLines = label.numberOfLines; textContainer.lineBreakMode = label.lineBreakMode; [layoutManager addTextContainer:textContainer]; // find tapped character NSUInteger characterIndex = [layoutManager characterIndexForPoint:tapLocation inTextContainer:textContainer fractionOfDistanceBetweenInsertionPoints:NULL]; // process link at tapped character [attr enumerateAtsortingbutesInRange:NSMakeRange(characterIndex, 1) options:0 usingBlock:^(NSDictionary * _Nonnull attrs, NSRange range, BOOL * _Nonnull stop) { if (attrs[NSLinkAtsortingbuteName]) { NSSsortingng* urlSsortingng = attrs[NSLinkAtsortingbuteName]; NSURL* url = [NSURL URLWithSsortingng:urlSsortingng]; [[UIApplication sharedApplication] openURL:url]; } }]; 

    Un ajout rapide à la description originale de Duncan C concernant le comportement de l’IB. Il écrit: “Il est sortingvial de rendre les hyperliens cliquables dans une UITextView. Vous devez simplement définir la case à cocher” détecter les liens “dans la vue dans IB, et il détecte les liens HTTP et les transforme en hyperliens.”

    Mon expérience (au moins dans xcode 7) est que vous devez également décocher le comportement “Editable” pour que les URL soient détectées et cliquables.

    Si vous souhaitez utiliser NSLinkAtsortingbuteName dans un UITextView, vous pouvez envisager d’utiliser la bibliothèque AtsortingbutedTextView. C’est une sous-classe UITextView qui facilite la gestion de ces sous-classes. Pour plus d’informations, voir: https://github.com/evermeer/AtsortingbutedTextView

    Vous pouvez faire en sorte que n’importe quelle partie du texte interagisse comme ceci (où textView1 est un UITextView IBoutlet):

     textView1.atsortingbuter = "1. ".red .append("This is the first test. ").green .append("Click on ").black .append("evict.nl").makeInteract { _ in UIApplication.shared.open(URL(ssortingng: "http://evict.nl")!, options: [:], completionHandler: { completed in }) }.underline .append(" for testing links. ").black .append("Next test").underline.makeInteract { _ in print("NEXT") } .all.font(UIFont(name: "SourceSansPro-Regular", size: 16)) .setLinkColor(UIColor.purple) 

    Et pour manipuler les hashtags et les mentions, vous pouvez utiliser un code comme celui-ci:

     textView1.atsortingbuter = "@test: What #hashtags do we have in @evermeer #AsortingbutedTextView library" .matchHashtags.underline .matchMentions .makeInteract { link in UIApplication.shared.open(URL(ssortingng: "https://twitter.com\(link.replacingOccurrences(of: "@", with: ""))")!, options: [:], completionHandler: { completed in }) } 

    L’excellente bibliothèque de @AliSoftware OHAtsortingbutedSsortingngAdditions facilite l’ajout de liens dans UILabel Voici la documentation: https://github.com/AliSoftware/OHAtsortingbutedSsortingngAdditions/wiki/link-in-UILabel

    Si vous voulez une sous-chaîne active dans votre UITextView, vous pouvez utiliser mon TextView étendu … c’est court et simple. Vous pouvez le modifier comme vous le souhaitez.

    résultat: entrer la description de l'image ici

    code: https://github.com/marekmand/ActiveSubssortingngTextView

     NSMutableAtsortingbutedSsortingng *atsortingbutedSsortingng = [[NSMutableAtsortingbutedSsortingng alloc] initWithSsortingng:strSomeTextWithLinks]; NSDictionary *linkAtsortingbutes = @{NSForegroundColorAtsortingbuteName: [UIColor redColor], NSUnderlineColorAtsortingbuteName: [UIColor blueColor], NSUnderlineStyleAtsortingbuteName: @(NSUnderlinePatternSolid)}; customTextView.linkTextAtsortingbutes = linkAtsortingbutes; // customizes the appearance of links textView.atsortingbutedText = atsortingbutedSsortingng; 

    POINTS CLÉS:

    • Assurez-vous que vous activez le comportement “sélectionnable” du UITextView dans XIB.
    • Assurez-vous de désactiver le comportement “Modifiable” de UITextView dans XIB.

    Utilisez UITextView et définissez dataDetectorTypes for Link.

    comme ça:

     testTextView.editable = false testTextView.dataDetectorTypes = .link 

    Si vous souhaitez détecter le lien, le numéro de téléphone, l’adresse, etc.

     testTextView.dataDetectorTypes = .all