Aktualizacja: od ios10,
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction;
Z ios7a Later UITextView
ma metodę delegata:
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange *NS_DEPRECATED_IOS(7_0, 10_0, "Use textView:shouldInteractWithURL:inRange:forInteractionType: instead");*
przechwytywania kliknięć prowadzących do linków. I to jest najlepszy sposób na zrobienie tego.
Dla ios6a wcześniej dobrym sposobem na zrobienie tego jest UIApplication
utworzenie podklasy i nadpisanie-(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
Będziesz musiał zaimplementować openURL:
w swoim delegacie.
Teraz, aby aplikacja zaczęła się z nową podklasą UIApplication
, zlokalizuj plik main.m w swoim projekcie. W tym małym pliku, który ładuje Twoją aplikację, zwykle znajduje się następująca linia:
int retVal = UIApplicationMain(argc, argv, nil, nil);
Trzeci parametr to nazwa klasy Twojej aplikacji. Tak więc, zamieniając tę linię na:
int retVal = UIApplicationMain(argc, argv, @"MyApplication", nil);
To załatwiło sprawę dla mnie.
UIApplication
i zastępować implementację openURL. Chociaż w ten sposób odniesienie do oryginalnej implementacji jest trudne (ale nie niemożliwe).W iOS 7 lub nowszym
Możesz użyć następującej metody delegata UITextView:
Widok tekstowy wywołuje tę metodę, jeśli użytkownik dotknie lub długo naciśnie łącze URL. Wdrożenie tej metody jest opcjonalne. Domyślnie widok tekstowy otwiera aplikację odpowiedzialną za obsługę typu adresu URL i przekazuje jej adres URL. Możesz użyć tej metody, aby wyzwolić alternatywną akcję, taką jak wyświetlenie treści WWW pod adresem URL w widoku sieci Web w bieżącej aplikacji.
Ważny:
źródło
UIWebView
jeśli chcesz, aby jakiś inny tekst był linkiem, a nie samym adresem URL. W takim przypadku<a>
tag jest nadal najlepszym rozwiązaniem.Dla Swift 3
lub jeśli celem jest> = IOS 10
źródło
W Swift 5 i iOS 12 możesz użyć jednego z trzech poniższych wzorców w celu interakcji z linkami w
UITextView
.# 1. Korzystanie
UITextView
zdataDetectorTypes
właściwości.Najprostszym sposobem interakcji z numerami telefonów, adresami URL lub adresami w domenie
UITextView
jest użyciedataDetectorTypes
własności. Poniższy przykładowy kod pokazuje, jak go zaimplementować. Za pomocą tego kodu, gdy użytkownik stuka w numer telefonu,UIAlertController
pojawi się ikona.# 2. Używając
UITextViewDelegate
'stextView(_:shouldInteractWith:in:interaction:)
metodyJeśli chcesz wykonać niestandardową akcję zamiast tworzyć plik
UIAlertController
wyskakujące okienko po dotknięciu numeru telefonu podczas korzystaniadataDetectorTypes
, musiszUIViewController
dostosować się doUITextViewDelegate
protokołu i zaimplementowaćtextView(_:shouldInteractWith:in:interaction:)
. Poniższy kod pokazuje, jak to zaimplementować:# 3. Za pomocą
NSAttributedString
iNSAttributedString.Key.link
Alternatywnie możesz użyć
NSAttributedString
i ustawićURL
dla jegoNSAttributedString.Key.link
atrybutu. Przykładowy kod poniżej pokazuje możliwą implementację tego atrybutu. W przypadku tego kodu, gdy użytkownik dotyka przypisanego ciągu,UIAlertController
pojawia się ikona.źródło
Wersja Swift:
Twoja standardowa konfiguracja UITextView powinna wyglądać mniej więcej tak, nie zapomnij o delegacie i dataDetectorTypes.
Po zakończeniu zajęć dodaj ten fragment:
źródło
Swift 4:
1) Utwórz następującą klasę (podklasę UITextView):
2) Gdziekolwiek ustawisz widok tekstu, zrób to:
Jeśli używasz scenorysu, upewnij się, że widok tekstu wygląda tak w inspektorze tożsamości w prawym okienku:
Voila! Teraz otrzymujesz natychmiastowe dotknięcie łącza zamiast tego, kiedy adres URL powinienInteractWith URL
źródło
Nie próbowałem tego osobiście, ale możesz spróbować zaimplementować
application:handleOpenURL:
metodę w swoim delegacie aplikacji - wygląda na to, że wszystkieopenURL
żądania przechodzą przez to wywołanie zwrotne.źródło
Nie jestem pewien, jak przechwycić wykryte łącze danych lub jakiego typu funkcji musisz uruchomić. Ale możesz skorzystać z metody didBeginEditing TextField, aby przeprowadzić test / skanowanie przez pole tekstowe, jeśli wiesz, czego szukasz, na przykład porównując ciągi tekstowe zgodne z formatem ### - ### - ####, lub zacznij od „www”. aby pobrać te pola, ale musiałbyś napisać mały kod, aby przeszukać łańcuch textfields, zrekonstruować to, czego potrzebujesz, a następnie wyodrębnić go do użycia przez funkcję. Nie sądzę, żeby to było takie trudne, gdy już zawęzisz dokładnie to, czego chciałeś, a następnie skupisz filtry instrukcji if () do bardzo konkretnego wzoru dopasowania tego, czego potrzebujesz.
Oczywiście oznacza to, że użytkownik ma zamiar dotknąć pola tekstowego, aby aktywować didBeginEditing (). Jeśli nie jest to typ interakcji użytkownika, którego szukałeś, możesz po prostu użyć wyzwalacza Timer, który uruchamia się na ViewDidAppear () lub innym w zależności od potrzeb i przechodzi przez ciąg tekstowy, a na końcu przebiega przez ciąg pola tekstowego metod, które stworzyłeś, po prostu wyłączasz Timer.
źródło
application:handleOpenURL:
jest wywoływana, gdy inna aplikacja otwiera plik aplikację, otwierając adres URL ze schematem obsługiwanym przez Twoją aplikację. Nie jest wywoływana, gdy aplikacja zaczyna otwierać adres URL.Myślę, że jedynym sposobem na zrobienie tego, czego chce Vladimir, jest użycie UIWebView zamiast UITextView. Spraw, aby kontroler widoku zaimplementował UIWebViewDelegate, ustaw delegata UIWebView na kontroler widoku oraz w implementacji kontrolera widoku,
webView:shouldStartLoadWithRequest:navigationType:
aby otworzyć[request URL]
w widoku zamiast zamykania aplikacji i otwierania jej w Mobile Safari.źródło