Update: Von ios10,
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction;
Von ios7und später UITextView
hat die Delegatenmethode:
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange *NS_DEPRECATED_IOS(7_0, 10_0, "Use textView:shouldInteractWithURL:inRange:forInteractionType: instead");*
um die Klicks auf Links abzufangen. Und das ist der beste Weg, es zu tun.
Zum ios6und früher ist es eine gute Möglichkeit, dies zu tun, indem Sie das unterordnen UIApplication
und überschreiben-(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
Sie müssen openURL:
in Ihrem Delegaten implementieren .
UIApplication
Um die Anwendung mit Ihrer neuen Unterklasse von zu starten , suchen Sie die Datei main.m in Ihrem Projekt. In dieser kleinen Datei, die Ihre App bootet, befindet sich normalerweise die folgende Zeile:
int retVal = UIApplicationMain(argc, argv, nil, nil);
Der dritte Parameter ist der Klassenname für Ihre Anwendung. Ersetzen Sie diese Zeile durch:
int retVal = UIApplicationMain(argc, argv, @"MyApplication", nil);
Das hat den Trick für mich getan.
UIApplication
die openURL-Implementierung auch kategorisieren und ersetzen. Auf diese Weise ist es schwierig (aber nicht unmöglich), auf die ursprüngliche Implementierung zu verweisen.In iOS 7 oder höher
Sie können die folgende UITextView-Delegatenmethode verwenden:
Die Textansicht ruft diese Methode auf, wenn der Benutzer auf den URL-Link tippt oder ihn lange drückt. Die Implementierung dieser Methode ist optional. Standardmäßig öffnet die Textansicht die Anwendung, die für die Verarbeitung des URL-Typs verantwortlich ist, und übergibt ihr die URL. Mit dieser Methode können Sie eine alternative Aktion auslösen, z. B. das Anzeigen des Webinhalts unter der URL in einer Webansicht in der aktuellen Anwendung.
Wichtig:
quelle
UIWebView
wenn Sie einen anderen Text als Link und nicht als URL selbst verwenden möchten . Das<a>
Tag ist in diesem Fall immer noch der beste Weg.Für Swift 3
oder wenn das Ziel> = IOS 10 ist
quelle
Schnelle Version:
Ihr Standard-UITextView-Setup sollte ungefähr so aussehen. Vergessen Sie nicht den Delegaten und die dataDetectorTypes.
Fügen Sie nach dem Ende Ihres Unterrichts dieses Stück hinzu:
quelle
Mit Swift 5 und iOS 12 können Sie eines der drei folgenden Muster verwenden, um mit Links in a zu interagieren
UITextView
.# 1. Verwenden
UITextView
derdataDetectorTypes
Eigenschaft von.Der einfachste Weg, mit Telefonnummern, URLs oder Adressen in einem zu interagieren,
UITextView
ist die Verwendung vondataDetectorTypes
Eigenschaften. Der folgende Beispielcode zeigt, wie er implementiert wird. Wenn der Benutzer mit diesem Code auf die Telefonnummer tippt, wird einUIAlertController
angezeigt.# 2. Mit
UITextViewDelegate
dertextView(_:shouldInteractWith:in:interaction:)
Methode vonWenn Sie eine benutzerdefinierte Aktion ausführen möchten, anstatt ein
UIAlertController
Popup zu erstellen, wenn Sie während der Verwendung auf eine Telefonnummer tippendataDetectorTypes
, müssen SieUIViewController
dasUITextViewDelegate
Protokoll anpassen und implementierentextView(_:shouldInteractWith:in:interaction:)
. Der folgende Code zeigt, wie es implementiert wird:#3. Verwenden von
NSAttributedString
undNSAttributedString.Key.link
Als Alternative können Sie mit
NSAttributedString
ein und setzenURL
für seinNSAttributedString.Key.link
Attribut folgenden Beispielcode zeigt eine mögliche Implementierung davon. Wenn der Benutzer mit diesem Code auf die zugewiesene Zeichenfolge tippt, wird einUIAlertController
Popup angezeigt.quelle
Swift 4:
1) Erstellen Sie die folgende Klasse (UITextView mit Unterklasse):
2) Tun Sie Folgendes, wo immer Sie Ihre Textansicht einrichten:
Wenn Sie ein Storyboard verwenden, stellen Sie sicher, dass Ihre Textansicht im Identitätsinspektor des rechten Bereichs wie folgt aussieht:
Voila! Jetzt erhalten Sie den Link sofort tippen anstatt wann die URL sollte mit der URL-Methode interagieren
quelle
Ich habe das selbst nicht versucht, aber Sie können versuchen, die
application:handleOpenURL:
Methode in Ihrem Anwendungsdelegierten zu implementieren. Es sieht so aus, als würden alleopenURL
Anforderungen diesen Rückruf durchlaufen.quelle
Sie sind sich nicht sicher, wie Sie die erkannte Datenverbindung abfangen würden oder welche Art von Funktion Sie ausführen müssen. Möglicherweise können Sie jedoch die didBeginEditing TextField-Methode verwenden, um einen Test / Scan durch das Textfeld auszuführen, wenn Sie wissen, wonach Sie suchen. So können Sie beispielsweise Textzeichenfolgen vergleichen, die dem Format ### - ### - #### entsprechen. oder beginnen Sie mit "www". Um diese Felder zu erfassen, müssten Sie jedoch einen kleinen Code schreiben, um die Zeichenfolge der Textfelder zu durchsuchen, das zu rekonstruieren, was Sie benötigen, und es dann für die Verwendung durch Ihre Funktion zu extrahieren. Ich denke nicht, dass dies so schwierig wäre, wenn Sie genau eingegrenzt haben, was Sie wollten, und dann Ihre if () -Anweisungsfilter auf ein ganz bestimmtes Übereinstimmungsmuster von dem konzentriert haben, was Sie brauchten.
Dies bedeutet natürlich, dass der Benutzer das Textfeld berühren wird, um didBeginEditing () zu aktivieren. Wenn dies nicht die Art von Benutzerinteraktion ist, nach der Sie gesucht haben, können Sie einfach einen Trigger-Timer verwenden, der je nach Bedarf auf ViewDidAppear () oder einem anderen Programm startet und die Textfeldzeichenfolge durchläuft. Am Ende durchlaufen Sie die Textfeldzeichenfolge Methoden, die Sie erstellt haben, schalten Sie einfach den Timer wieder aus.
quelle
application:handleOpenURL:
wird aufgerufen, wenn eine andere App Ihre App öffnet, indem Sie eine URL mit einem von Ihrer App unterstützten Schema öffnen. Es wird nicht aufgerufen, wenn Ihre App eine URL öffnet.Ich denke, der einzige Weg, um das zu tun, was Vladimir will, ist die Verwendung eines UIWebView anstelle eines UITextView. Lassen Sie Ihren View Controller UIWebViewDelegate implementieren, setzen Sie den UIWebView-Delegaten auf den View Controller und
webView:shouldStartLoadWithRequest:navigationType:
öffnen Sie[request URL]
im View Controller-Implementieren eine Ansicht, anstatt Ihre App zu beenden und in Mobile Safari zu öffnen .quelle