J'ai un UITextView
qui est géré via Interface Builder. En tant que détection de données, j'ai vérifié "Liens". Sous iOS 6, tout fonctionne correctement et les liens sont mis en surbrillance et cliquables. Dans iOS 7, tous les liens restent simplement du texte brut. Les cases à cocher modifiables et sélectionnables ne sont pas cochées.
Ce qui peut être préoccupant, c'est que UITextView
est une sous-vue d'une vue conteneur qui se trouve à nouveau dans un UIScrollView
.
Il semble que dans iOS 7, la détection de lien ne fonctionne que si le UITextView
est sélectionnable. Donc, rendant mon UITextView
non sélectionnable impossible, la détection de lien ne fonctionnait plus.
J'ai également testé cela dans iOS 6 et je peux confirmer que dans iOS 6, la détection de lien fonctionne correctement, même si le UITextView
n'est pas sélectionnable.
J'ai eu quelques problèmes avec la détection de numéro de téléphone aujourd'hui. Il semblait que UITextView conserverait les anciens numéros de téléphone et garderait le texte en surbrillance après avoir réglé le texte sur autre chose.
J'ai trouvé que si je définissaisText: nil avant de définir le texte sur la nouvelle chaîne, la vue texte serait réinitialisée et les numéros de téléphone surlignés seraient mis en évidence normalement. Je me demande s'il s'agit d'une sorte de bogue avec UITextView dans iOS 7.0
De toute façon, cela a fonctionné pour moi.
Quand iOS7 est sorti pour la première fois, cela m'a tourmenté et j'ai trouvé une réponse dans ce fil de discussion (définir l'attribut de texte de UITextView sur nil avant de définir la valeur réelle a joué le tour). Puis tout à coup, le problème (pour moi c’était toute la chaîne mise en surbrillance comme un lien) s’est refermé (probablement à cause d’une mise à jour iOS).
En fin de compte, le truc pour moi a été d'arrêter d'utiliser l'attribut text et de définir l'attribut attributText. Une fois que j'ai fait cela, la nécessité de définir les polices/défilement/sélectionnable/modifiable/etc. par programme, disparu. J'ai défini mon UITextView dans IB, défini les valeurs à ma guise (non défilables, non modifiables, sélectionnables, détectant les liens et les numéros de téléphone), puis créé une chaîne et un attribut attribués:
myUITextView.attributedString = myAttributedString;
Et soudain, tout a fonctionné comme prévu. J'espère que cela aide quelqu'un d'autre sur la route.
J'ai eu le même problème et la désactivation du défilement sur UITextView active la détection de lien au chargement plutôt que de ne fonctionner que lorsque l'utilisateur a interagi avec textview. UITextView devait également être sélectionnable et non modifiable.
detailTextView.scrollEnabled = NO;
detailTextView.editable = NO;
detailTextView.selectable = YES;
Être sélectionnable ou avoir le défilement activé n'est pas nécessaire sur iOS6.
Une autre chose à vérifier est que l’interaction de l’utilisateur est activée sur la cellule et la vue de contenu de la cellule, sinon le lien ne sera pas cliquable.
Vérifiez que ces lignes doivent être ajoutées pour utiliser la propriété de détection de données de textview
dans la cellule UItableView
.
txtvwMsgText.userInteractionEnabled = YES;
txtvwMsgText.dataDetectorTypes = UIDataDetectorTypeLink;
txtvwMsgText.scrollEnabled = NO;
txtvwMsgText.editable = NO;
txtvwMsgText.selectable = YES;
Vous devriez vérifier NSDataDetector
.
Vous pouvez l'utiliser pour rechercher et traiter différentes données (liens, numéros de téléphone, etc.). Regardez sur ce site:
http://nshipster.com/nsdatadetector/
Vous pouvez également utiliser la propriété dataDetectorTypes
de UITextView
pour définir ce que vous souhaitez détecter dans le code. Peut-être juste un problème de transition de storyboard pour vous.
textView.dataDetectorTypes = UIDataDetectorTypeLink;
Sachez que votre textview ne reconnaîtra les liens que si n'est pas éditable!
Voici un bon tutoriel sur la façon de faire un editable UITextView
avec `link detection``
ITextView éditable avec détection de lien
Je n'ai rencontré aucun problème avec cette solution depuis maintenant.
Le truc est un GestureRecognizer pour avertir et activer/désactiver l'édition.
Vous pouvez appliquer la même chose avec le selectable / not selectable
numéro sur iOS7
Après quelques tests, j'ai trouvé une solution.
Si vous souhaitez que les liens soient actifs et que la sélection ne soit pas activée, vous devez modifier gestureRecognizers.
Par exemple, il existe 3 LongPressGestureRecognizers. Un pour cliquer sur le lien (minimumPressDuration = 0,12), un deuxième pour un zoom en mode éditable (minimumPressDuration = 0,5), un troisième pour la sélection (minimumPressDuration = 0,8). Cette solution supprime LongPressGestureRecognizer pour la sélection et second pour le zoom en mode édition.
NSArray *textViewGestureRecognizers = self.captionTextView.gestureRecognizers;
NSMutableArray *mutableArrayOfGestureRecognizers = [[NSMutableArray alloc] init];
for (UIGestureRecognizer *gestureRecognizer in textViewGestureRecognizers) {
if (![gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) {
[mutableArrayOfGestureRecognizers addObject:gestureRecognizer];
} else {
UILongPressGestureRecognizer *longPressGestureRecognizer = (UILongPressGestureRecognizer *)gestureRecognizer;
if (longPressGestureRecognizer.minimumPressDuration < 0.3) {
[mutableArrayOfGestureRecognizers addObject:gestureRecognizer];
}
}
}
self.captionTextView.gestureRecognizers = mutableArrayOfGestureRecognizers;
Testé sur iOS 9, mais il devrait fonctionner sur toutes les versions (iOS 7, 8, 9). J'espère que ça aide! :)
J'ai trouvé le truc, ça marche sous iOS 7!
Vous devez définir la UITextView sélectionnable dans votre xib ou par programme
self.yourTextView.selectable = YES;
et puis vous devez désactiver les parchemins et réactiver après avoir défini votre texte.
self.yourTextView.scrollEnabled = NO;
[self.yourTextView setText:contentString];
self.yourTextView.scrollEnabled = YES;
Donc, utiliser un UITextView pour le garder activé, sélectionnable, non défilable et les liens détectables n'est pas aussi simple qu'il y paraît. J'ai rencontré cela dans iOS 8. Ma solution a donc été de procéder de la sorte dans viewDidLoad, puis de définir la propriété modifiable sur NO lorsque l'édition de la zone de texte est effectuée (ce serait généralement une méthode comme doneIsTapped). L'astuce consiste à définir la propriété modifiable sur NO une fois que la définition de la valeur du texte sur textview est terminée. Cela activera les liens dans UITextview.
- (void)viewDidLoad
{
[super viewDidLoad];
self.txtViewComment.editable = YES;
self.txtViewComment.selectable = YES;
self.txtViewComment.dataDetectorTypes = UIDataDetectorTypeLink;
self.txtViewComment.scrollEnabled = NO;
}
et
- (IBAction)doneIsTapped:(id)sender
{
self.txtViewComment.text = @"set text what ever you want";
self.txtViewComment.editable = NO;
}
cela a rendu les liens activés dans textview. Aussi, je recommanderais de ne pas utiliser de story board pour le moment (ou avant Apple corrige ce problème) et d'utiliser simplement du code pour éviter toute confusion inutile. J'espère que cela vous aidera.
Changer la couleur de teinte en une autre couleur fonctionne réellement. Toutefois, si cette option est activée, la teinte sera également de la même couleur.
La désactivation de la fonction de défilement UITextViews m'a permis de réussir dans une configuration similaire.
Définissez la propriété de défilement de UITextView sur Non, cela fonctionnera ... Self.textView.ScrollingEnable = NO;
Cette solution fonctionne pour moi:
textView.selectable = YES;
textView.delegate = self;
- (void) textViewDidChangeSelection:(UITextView *)textView;
{
NSRange range = NSMakeRange(NSNotFound, 0.0);
if ( range.length && !NSEqualRanges(range, textView.selectedRange) ) {
textView.selectedRange = range;
}
}
Si vous ajoutez UITextview par programme, ajoutez simplement les lignes ci-dessous:
_textView.userInteractionEnabled = YES;
_textView.dataDetectorTypes = UIDataDetectorTypeLink;
_textView.scrollEnabled = NO;
_textView.editable = NO;
Cela a fonctionné pour moi.
Bien que ce fil de discussion soit ancien, je n'ai pas vu de réponse qui fonctionne pour moi avec Swift, alors voici pour Swift 2.2
textView.dataDetectorTypes = UIDataDetectorTypes.Link
textView.selectable = true
Aucun de ce qui précède n'a fonctionné pour moi, j'ai plutôt fait ceci:
[self.textView setDataDetectorTypes:UIDataDetectorTypeNone];
[self.textView.setTextColor:[UIColor whiteColor]];
[self.textView setDataDetectorTypes:UIDataDetectorTypeNone];
C'est ce que j'ai fait avec ma vue de texte censée détecter tous les types et dont les couleurs non détectées étaient définies en blanc. Vous pouvez modifier le code pour représenter votre couleur et le type de lien à détecter.