Łatwo jest klikać hiperłącza w pliku UITextView
. Po prostu ustawiłeś pole wyboru „wykrywaj łącza” w widoku w IB, który wykrywa łącza HTTP i zamienia je w hiperłącza.
Jednak nadal oznacza to, że użytkownik widzi link „raw”. Zarówno pliki RTF, jak i HTML umożliwiają ustawienie czytelnego dla użytkownika ciągu z linkiem „za” nim.
Łatwo jest zainstalować przypisany tekst w widoku tekstu (lub a UILabel
lubUITextField
, jeśli o to chodzi). Jednak gdy ten przypisany tekst zawiera link, nie można go kliknąć.
Czy istnieje sposób, aby tekst czytelny dla użytkownika był klikalny w UITextView
, UILabel
lubUITextField
?
Znaczniki różnią się w przypadku SO, ale oto ogólny pomysł. Chcę tylko takiego tekstu:
Ta przemiana została wygenerowana za pomocą Face Dancer , kliknij, aby wyświetlić w App Store.
Jedyne, co mogę uzyskać, to:
Ta przemiana została wygenerowana za pomocą Face Dancer. Kliknij http://example.com/facedancer, aby wyświetlić w sklepie z aplikacjami.
źródło
Odpowiedzi:
Użyj NSMutableAttributString .
Edytuj :
Nie chodzi tu bezpośrednio o pytanie, ale jedynie o wyjaśnienie
UITextField
iUILabel
nie obsługuje otwierania adresów URL. Jeśli chcesz używaćUILabel
z linkami, możesz sprawdzić TTTAttributLabel .Powinieneś także ustawić
dataDetectorTypes
swoją wartośćUITextView
naUIDataDetectorTypeLink
lubUIDataDetectorTypeAll
do otwartych URL po kliknięciu. Lub możesz użyć metody delegowania zgodnie z sugestiami w komentarzach.źródło
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
NSURL
. ----[str addAttribute: NSLinkAttributeName value: [NSURL URLWithString:@"http://www.google.com"] range: NSMakeRange(0, str.length)];
NSAttributedString.h
UIKIT_EXTERN NSString * const NSLinkAttributeName NS_AVAILABLE(10_0, 7_0); // NSURL (preferred) or NSString
Uznałem to za bardzo przydatne, ale musiałem to zrobić w kilku miejscach, więc swoje podejście zawarłem w prostym rozszerzeniu do
NSMutableAttributedString
:Szybki 3
Swift 2
Przykładowe użycie:
Cel C
Właśnie spełniłem wymóg, aby zrobić to samo w czystym projekcie Objective-C, więc oto kategoria Objective-C.
Przykładowe użycie:
Upewnij się, że atrybut Zachowania NSTextField jest ustawiony jako Dostępny.
źródło
Właśnie utworzyłem podklasę UILabel, aby specjalnie adresować takie przypadki użycia. Możesz łatwo dodawać wiele linków i definiować dla nich różne programy obsługi. Obsługuje także podświetlanie naciśniętego łącza po dotknięciu w celu uzyskania informacji zwrotnej. Proszę odnieść się do https://github.com/null09264/FRHyperLabel .
W twoim przypadku kod może się podobać:
Przykładowy zrzut ekranu (w tym przypadku moduł obsługi ustawia ostrzeżenie zamiast otwierać adres URL)
źródło
- (void)setLinkForRange:(NSRange)range withLinkHandler:(void(^)(FRHyperLabel *label, NSRange selectedRange))handler;
zamiast tego interfejsu API . Proszę odnieść się do pliku Readme na stronie github.Niewielkie udoskonalenie rozwiązania ujell: jeśli używasz NSURL zamiast NSString, możesz użyć dowolnego adresu URL (np. Niestandardowych adresów URL)
Baw się dobrze!
źródło
Swift 4:
Swift 3.1:
źródło
Ja również miałem podobne wymagania, początkowo korzystałem z UILabel, a potem zdałem sobie sprawę, że UITextView jest lepszy. Sprawiłem, że UITextView zachowuje się jak UILabel, wyłączając interakcję i przewijanie, i stworzyłem metodę kategorii,
NSMutableAttributedString
aby ustawić link do tekstu tak samo jak to, co zrobił Karl (+1 za to), to jest moja wersja objcmożesz użyć poniższego delegata, aby obsłużyć akcję
źródło
NSForegroundColorAttributeName
w zakresie, w którymNSLinkAttributeName
zastosowano, nie działa. Nie ma znaczenia co do zawartości,linkTextAttributes
zUITextView
są stosowane zamiennie. CzyNSForegroundColorAttributeName
działa dla ciebie?linkTextAttributes
na to samo? a możetintColor
? Czy jesteś w stanie sprawić, aby 2 linki były wyświetlane w różnych kolorach w tym samym widoku tekstu?Użyj UITextView obsługuje linki klikalne. Utwórz przypisany ciąg przy użyciu następującego kodu
Następnie ustaw tekst UITextView w następujący sposób
Upewnij się, że w XIB włączono „wybieralne” zachowanie UITextView.
źródło
Selectable
jest ważna!Sercem mojego pytania było to, że chciałem móc tworzyć klikalne łącza w widokach / polach / etykietach tekstu bez konieczności pisania niestandardowego kodu do manipulowania tekstem i dodawania łączy. Chciałem, aby był oparty na danych.
W końcu wymyśliłem, jak to zrobić. Problem polega na tym, że IB nie honoruje osadzonych linków.
Co więcej, wersja iOS
NSAttributedString
nie pozwala na inicjalizację przypisanego ciągu z pliku RTF. OS X wersjaNSAttributedString
ma mieć inicjator która pobiera plik RTF jako wejście.NSAttributedString
jest zgodny z protokołem NSCoding, dzięki czemu można przekonwertować go na / z NSDataUtworzyłem narzędzie wiersza polecenia OS X, które pobiera plik RTF jako dane wejściowe i wysyła plik z rozszerzeniem .data, który zawiera NSData z NSCoding. Następnie wstawiam plik .data do mojego projektu i dodaję kilka wierszy kodu, które ładują tekst do widoku. Kod wygląda następująco (ten projekt był w Swift):
W przypadku aplikacji, które używają dużo sformatowanego tekstu, tworzę regułę kompilacji, która mówi Xcode, że wszystkie pliki .rtf w danym folderze są źródłowe, a pliki .data są danymi wyjściowymi. Kiedy to zrobię, po prostu dodaję pliki .rtf do wyznaczonego katalogu (lub edytuję istniejące pliki), a proces kompilacji dowiaduje się, że są one nowe / aktualizowane, uruchamia narzędzie wiersza poleceń i kopiuje pliki do pakietu aplikacji. Działa pięknie.
Napisałem post na blogu, który prowadzi do przykładowego (Swift) projektu demonstrującego tę technikę. Możesz to zobaczyć tutaj:
Tworzenie klikalnych adresów URL w polu UITextField, które otwierają się w Twojej aplikacji
źródło
Przykład szybkiego 3, aby wykryć działania na przypisanych dotknięciach tekstu
https://stackoverflow.com/a/44226491/5516830
Podobnie, możesz dodać dowolną akcję za
shouldInteractWith URL
pomocą metody UITextFieldDelegate.Twoje zdrowie!!
źródło
Szybką odpowiedzią jest użycie UITextView zamiast UILabel. Musisz włączyć
Selectable
i wyłączyćEditable
.Następnie wyłącz wskaźniki przewijania i odbicia.
Moje rozwiązanie za pomocą
NSMutableAttributedString
ciągu HTMLNSHTMLTextDocumentType
źródło
NSAttributedString
, ustawić jakoattributedText
mójUITextView
i hiperłącza po prostu działają! Znalezienie zakresu każdego hiperłącza i skonfigurowanie go za pomocą atrybutów byłoby dużo pracy.Napisałem metodę, która dodaje link (linkString) do ciągu (fullString) z pewnym adresem URL (urlString):
Powinieneś to tak nazwać:
źródło
Musiałem nadal używać czystego UILabel, tak zwanego tego z mojego rozpoznawania zaczepów (jest to oparte na odpowiedzi malex tutaj: Indeks znaków w punkcie dotykowym dla UILabel )
źródło
Aktualizacja:
Moje pytanie zawierało 2 kluczowe części:
Okazuje się, że iOS 7 dodał możliwość ładowania przypisanego tekstu
NSData
.Stworzyłem niestandardową podklasę,
UITextView
która korzysta z@IBInspectable
atrybutu i pozwala ładować zawartość z pliku RTF bezpośrednio w IB. Po prostu wpisz nazwę pliku w IB, a klasa niestandardowa zajmie się resztą.Oto szczegóły:
W iOS 7
NSAttributedString
uzyskał tę metodęinitWithData:options:documentAttributes:error:
. Ta metoda pozwala załadować NSAttributString z obiektu NSData. Możesz najpierw załadować plik RTF do NSData, a następnie użyćinitWithData:options:documentAttributes:error:
do załadowania tego NSData do widoku tekstowego. (Należy pamiętać, że istnieje również metodainitWithFileURL:options:documentAttributes:error:
, która załaduje przypisany ciąg bezpośrednio z pliku, ale ta metoda została wycofana w iOS 9. Bezpieczniej jest użyć tej metodyinitWithData:options:documentAttributes:error:
, która nie była przestarzała.Chciałem metody, która pozwoli mi zainstalować klikalne linki w moich widokach tekstowych bez konieczności tworzenia kodu specyficznego dla linków, których używałem.
Rozwiązaniem, które wymyśliłem, było utworzenie niestandardowej podklasy wywoływanej przez UITextView
RTF_UITextView
i nadanie jej@IBInspectable
właściwości o nazwieRTF_Filename
. Dodawanie@IBInspectable
atrybutu do właściwości powoduje, że Konstruktor interfejsu ujawnia tę właściwość w „Inspektorze atrybutów”. Następnie możesz ustawić tę wartość z IB bez kodu niestandardowego.Dodałem również
@IBDesignable
atrybut do mojej klasy niestandardowej.@IBDesignable
Atrybut Xcode mówi, że powinien on zainstalować uruchomioną kopię widoku niestandardowego interfejsu klasy do konstruktora, więc można zobaczyć go w graficznym wyświetlaczu widzenia hierarchii. () Niestety, dla tej klasy@IBDesignable
właściwość wydaje się niestabilna. Działało, kiedy go po raz pierwszy dodałem, ale potem usunąłem zwykły tekst z mojego widoku tekstowego, a klikalne łącza w moim widoku zniknęły i nie byłem w stanie ich odzyskać).Mój kod
RTF_UITextView
jest bardzo prosty. Oprócz dodania@IBDesignable
atrybutu iRTF_Filename
właściwości do@IBInspectable
atrybutu dodałemdidSet()
metodę doRTF_Filename
właściwości.didSet()
Metoda jest wywoływana w dowolnym momencie wartośćRTF_Filename
zmian własności. KoddidSet()
metody jest dość prosty:Zauważ, że jeśli właściwość @IBDesignable nie pozwoli w niezawodny sposób wyświetlić podglądu stylizowanego tekstu w Konstruktorze interfejsów, może być lepiej ustawić powyższy kod jako rozszerzenie UITextView zamiast niestandardowej podklasy. W ten sposób można go używać w dowolnym widoku tekstu bez konieczności zmiany widoku tekstu na klasę niestandardową.
Zobacz moją inną odpowiedź, jeśli potrzebujesz obsługiwać wersje iOS wcześniejsze niż iOS 7.
Możesz pobrać przykładowy projekt zawierający tę nową klasę z gitHub:
Projekt demonstracyjny DatesInSwift na Github
źródło
Po prostu znajdź rozwiązanie bez kodu dla UITextView:
Włącz wykrywanie-> Opcje linków, adres URL oraz adres e-mail zostaną wykryte i klikalne!
źródło
Wersja szybka:
źródło
Użyj UITextView i ustaw dataDetectorTypes dla Link.
lubię to:
Jeśli chcesz wykryć link, numer telefonu, adres itp. Następnie
źródło
http://somedomain/someurl?param=value
Szybki dodatek do oryginalnego opisu Duncana C w stosunku do zachowania IB. Pisze: „To proste, aby hiperłącza można było klikać w UITextView. Po prostu ustawiłeś pole wyboru„ wykrywaj linki ”w widoku w IB, a on wykrywa łącza http i zamienia je w hiperłącza”.
Moje doświadczenie (przynajmniej w xcode 7) polega na tym, że musisz również odznaczyć zachowanie „Edytowalne”, aby adresy URL były wykrywane i klikalne.
źródło
Jeśli masz problemy z tym, co @Karl Nosworthy i @esilver podali powyżej, zaktualizowałem rozszerzenie NSMutableAttributString do wersji Swift 4.
źródło
Doskonała biblioteka @AliSoftware
OHAttributedStringAdditions
ułatwia dodawanie linkówUILabel
tutaj jest dokumentacja: https://github.com/AliSoftware/OHAttributStringAdditions/wiki/link-in-UILabelźródło
Jeśli chcesz użyć NSLinkAttributeName w UITextView, możesz rozważyć użycie biblioteki AttributeTextView. Jest to podklasa UITextView, która sprawia, że bardzo łatwo sobie z nimi poradzić. Aby uzyskać więcej informacji, zobacz: https://github.com/evermeer/AttributTextView
Możesz sprawić, by jakakolwiek część tekstu współdziałała w ten sposób (gdzie textView1 to IBoutlet UITextView):
Do obsługi hashtagów i wzmianek możesz użyć takiego kodu:
źródło
jeśli chcesz mieć aktywne podciągi w swoim UITextView, możesz użyć mojego rozszerzonego TextView ... jest krótki i prosty. Możesz go edytować, jak chcesz.
wynik:
kod: https://github.com/marekmand/ActiveSubstringTextView
źródło
KLUCZOWE PUNKTY:
źródło