Mam, UITextView
który wyświetla NSAttributedString
. Ten ciąg zawiera słowa, które chciałbym uczynić możliwymi do kliknięcia, tak że po ich dotknięciu jestem wywoływany z powrotem, aby móc wykonać akcję. Zdaję sobie sprawę, że UITextView
może wykryć dotknięcia adresu URL i oddzwonić do mojego pełnomocnika, ale to nie są adresy URL.
Wydaje mi się, że z iOS 7 i mocą TextKit powinno to być teraz możliwe, jednak nie mogę znaleźć żadnych przykładów i nie jestem pewien, od czego zacząć.
Rozumiem, że jest teraz możliwe tworzenie niestandardowych atrybutów w ciągu znaków (chociaż jeszcze tego nie zrobiłem) i być może przydadzą się do wykrycia, czy któreś z magicznych słów zostało dotknięte? W każdym razie nadal nie wiem, jak przechwycić to dotknięcie i wykryć, na którym słowie nastąpiło dotknięcie.
Pamiętaj, że zgodność z iOS 6 nie jest wymagana.
źródło
Wykrywanie dotknięć przypisanego tekstu za pomocą Swift
Czasami początkującym jest trochę trudno wiedzieć, jak to zrobić (i tak było dla mnie), więc ten przykład jest trochę pełniejszy.
Dodaj
UITextView
do swojego projektu.Wylot
Podłącz
UITextView
doViewController
z gniazdem o nazwietextView
.Atrybut niestandardowy
Zamierzamy utworzyć atrybut niestandardowy, tworząc rozszerzenie .
Dodaj nowy plik Swift za pomocą polecenia Plik> Nowy> Plik ...> iOS> Źródło> Swift Plik . Możesz to nazwać, jak chcesz. Nazywam mój NSAttributedStringKey + CustomAttribute.swift .
Wklej następujący kod:
Kod
Zastąp kod w ViewController.swift następującym. Zwróć uwagę na
UIGestureRecognizerDelegate
.Jeśli teraz dotkniesz „w” opcji „Swift”, powinieneś otrzymać następujący wynik:
Uwagi
NSAttributedString.Key.foregroundColor
(kolor tekstu) mieć wartośćUIColor.green
.Dalsze badanie
Ta odpowiedź została oparta na kilku innych odpowiedziach na to pytanie. Oprócz tego zobacz także
źródło
myTextView.textStorage
zamiastmyTextView.attributedText.string
To jest nieco zmodyfikowana wersja, oparta na odpowiedzi @tarmes. Nie mogłem zmusić
value
zmiennej do zwracania czegokolwiek, alenull
bez poniższych poprawek. Potrzebowałem również zwróconego pełnego słownika atrybutów, aby określić wynikową akcję. Umieściłbym to w komentarzach, ale nie wydaje się, żebym miał tego przedstawiciela. Z góry przepraszam, jeśli naruszyłem protokół.Specyficzną modyfikacją jest użycie
textView.textStorage
zamiasttextView.attributedText
. Jako wciąż uczący się programista iOS nie jestem do końca pewien, dlaczego tak jest, ale być może ktoś inny może nas oświecić.Specyficzna modyfikacja sposobu obsługi kranu:
Pełny kod w moim kontrolerze widoku
źródło
Tworzenie niestandardowego łącza i robienie tego, co chcesz za pomocą kranu, stało się znacznie łatwiejsze dzięki iOS 7. Bardzo dobry przykład jest w Ray Wenderlich
źródło
UITextView
nie wykrywa linków, nawet jeśli ustawiłem go na wykrywanie ich przez IB. (Zrobiłem również, że nie można go wybrać)Przykład WWDC 2013 :
źródło
Udało mi się rozwiązać ten problem po prostu za pomocą NSLinkAttributeName
Szybki 2
źródło
if URL.scheme == "cs"
ireturn true
poza niąif
, abyUITextView
mógł obsłużyć zwykłe klikanehttps://
linkiKompletny przykład wykrywania działań na przypisanym tekście za pomocą Swift 3
Następnie możesz złapać akcję za pomocą
shouldInteractWith URL
metody delegata UITextViewDelegate, więc upewnij się, że ustawiłeś delegata poprawnie.Podobnie jak mądrze, możesz wykonać dowolną akcję zgodnie ze swoimi wymaganiami.
Twoje zdrowie!!
źródło
Można to zrobić za pomocą
characterIndexForPoint:inTextContainer:fractionOfDistanceBetweenInsertionPoints:
. Działa to nieco inaczej, niż chciałeś - będziesz musiał sprawdzić, czy dotknięta postać należy do magicznego słowa . Ale to nie powinno być skomplikowane.Przy okazji gorąco polecam obejrzenie zestawu wprowadzającego z WWDC 2013.
źródło
Dzięki Swift 5 i iOS 12 możesz utworzyć podklasę
UITextView
i zastąpićpoint(inside:with:)
ją niektórymi implementacjami TextKit, aby tylko niektóreNSAttributedStrings
z nich były dostępne.Poniższy kod pokazuje, jak utworzyć element,
UITextView
który reaguje tylko na dotknięcia podkreślonychNSAttributedString
w nim s:InteractiveUnderlinedTextView.swift
ViewController.swift
źródło
Ten może działać dobrze z krótkim linkiem, łączem wielokrotnym w widoku tekstowym. Działa OK z iOS 6,7,8.
źródło
Użyj tego rozszerzenia dla Swift:
Dodaj
UITapGestureRecognizer
do widoku tekstu za pomocą następującego selektora:źródło