Frage

Ist es möglich, benutzerdefinierte Aktion auszuführen, wenn der Benutzer Touch-Handy Link in UITextView automatisch erkannt. Bitte keine Ratschläge UIWebView zu verwenden, anstatt.

Und bitte nicht nur wiederholen Text von Apple Klassen Referenz  -. Sicherlich habe ich es schon gelesen

Danke.

War es hilfreich?

Lösung

Update: Von ,

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction;

und später UITextView hat die Delegierten Methode:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange *NS_DEPRECATED_IOS(7_0, 10_0, "Use textView:shouldInteractWithURL:inRange:forInteractionType: instead");*

die Klicks auf Links abzufangen. Und dies ist der beste Weg, es zu tun.

Für und früher eine schöne Art und Weise zu dies tun, ist durch Subklassen UIApplication und Überschreiben des -(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 Ihrer Stellvertretung implementieren.

, nun mit Ihrer neuen Unterklasse von UIApplication die Anwendung starten müssen, suchen Sie die Datei main.m in Ihrem Projekt. In dieser kleinen Datei, die Schopf aus dem Sumpf der App, da in der Regel diese Zeile:

int retVal = UIApplicationMain(argc, argv, nil, nil);

Der dritte Parameter ist der Klassenname für Ihre Anwendung. So ersetzen Sie diese Zeile für:

int retVal = UIApplicationMain(argc, argv, @"MyApplication", nil);

Dies hat den Trick für mich.

Andere Tipps

In iOS 7 oder höher

Sie können den folgenden UITextView Delegatmethode verwenden:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange

Die Textansicht ruft diese Methode, wenn die Benutzer Hähne oder Lang drückt den URL-Link. Die Durchführung dieses Verfahrens ist optional. Standardmäßig öffnet die Textansicht die Anwendung verantwortlich für den Umgang mit dem URL-Typ und übergibt ihr die URL. Sie können diese Methode verwenden, um eine alternative Maßnahme, wie die Anzeige die Web-Inhalte in der URL in einer Web-Ansicht in der aktuellen Anwendung auszulösen.

Wichtig:

  

Links in Textansichten sind interaktiv nur, wenn die Textansicht ist   wählbar, aber nicht editierbar. Das heißt, wenn der Wert des UITextView   die selektierbare Eigenschaft JA und das isEditable Objekt ist nicht.

Für Swift 3

textView.delegate = self

extension MyTextView: UITextViewDelegate 

    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {

        GCITracking.sharedInstance.track(externalLink: URL)
        return true
    }
}

oder, wenn das Ziel ist> = IOS 10

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool

Swift-Version:

Ihr Standard UITextView Setup wie folgt aussehen sollte, nicht zu vergessen die Delegierten und dataDetectorTypes.

var textView = UITextView(x: 10, y: 10, width: CardWidth - 20, height: placeholderHeight) //This is my custom initializer
textView.text = "dsfadsaf www.google.com"
textView.selectable = true
textView.dataDetectorTypes = UIDataDetectorTypes.Link
textView.delegate = self
addSubview(textView)

Nach Ihrer Klasse Ende hinzufügen, um dieses Stück:

class myVC: UIViewController {
    //viewdidload and other stuff here
}

extension MainCard: UITextViewDelegate {
    func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
        //Do your stuff over here
        var webViewController = SVModalWebViewController(URL: URL)
        view.presentViewController(webViewController, animated: true, completion: nil)
        return false
    }
}

Mit Swift 5 und iOS 12, eine der drei folgenden Muster zusammenzuwirken, um mit Links in einem UITextView verwenden können.


# 1. Mit UITextView dataDetectorTypes Eigenschaft.

Der einfachste Weg, mit Telefonnummern, URLs oder Adressen in einer UITextView zu interagieren ist dataDetectorTypes Eigenschaft zu verwenden. Der folgende Beispielcode zeigt, wie es zu implementieren. Mit diesem Code, wenn der Benutzer Taps unter der Telefonnummer, ein UIAlertController erscheint.

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let textView = UITextView()
        textView.text = "Phone number: +33687654321"
        textView.isUserInteractionEnabled = true
        textView.isEditable = false
        textView.isSelectable = true
        textView.dataDetectorTypes = [.phoneNumber]
        textView.isScrollEnabled = false

        textView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(textView)
        textView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        textView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        textView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor).isActive = true
    }

}

# 2. Mit UITextViewDelegate textView(_:shouldInteractWith:in:interaction:) Methode

Wenn Sie einige benutzerdefinierte Aktion ausgeführt werden soll, statt eine UIAlertController Pop-up zu machen, wenn Sie auf eine Telefonnummer tippen, während dataDetectorTypes verwenden, müssen Sie Ihre UIViewController zu UITextViewDelegate Protokoll machen entsprechen und textView(_:shouldInteractWith:in:interaction:) implementieren. Der folgende Code zeigt, wie es zu implementieren:

import UIKit

class ViewController: UIViewController, UITextViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let textView = UITextView()
        textView.delegate = self
        textView.text = "Phone number: +33687654321"
        textView.isUserInteractionEnabled = true
        textView.isEditable = false
        textView.isSelectable = true
        textView.dataDetectorTypes = [.phoneNumber]
        textView.isScrollEnabled = false

        textView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(textView)
        textView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        textView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        textView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor).isActive = true
    }

    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
        /* perform your own custom actions here */
        print(URL) // prints: "tel:+33687654321"

        return false // return true if you also want UIAlertController to pop up
    }

}

# 3. Mit NSAttributedString und NSAttributedString.Key.link

Als Alternative können Sie NSAttributedString verwenden und eine URL für seine NSAttributedString.Key.link Attribut folgende Beispielcode zeigt eine mögliche Implementierung davon eingestellt. Mit diesem Code, wenn der Benutzer Taps auf dem zugeschrieben Zeichenfolge, ein UIAlertController erscheint.

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let attributedString = NSMutableAttributedString(string: "Contact: ")
        let phoneUrl = NSURL(string: "tel:+33687654321")! // "telprompt://+33687654321" also works
        let attributes = [NSAttributedString.Key.link: phoneUrl]
        let phoneAttributedString = NSAttributedString(string: "phone number", attributes: attributes)
        attributedString.append(phoneAttributedString)

        let textView = UITextView()
        textView.attributedText = attributedString
        textView.isUserInteractionEnabled = true
        textView.isEditable = false
        textView.isSelectable = true
        textView.isScrollEnabled = false

        textView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(textView)
        textView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        textView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        textView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor).isActive = true
    }

}

Ich habe nicht versucht, dass mich aber man kann versuchen application:handleOpenURL: Methode in Ihrer Anwendung delegieren zu implementieren - es sieht aus wie alle openURL Anfrage Durchlauf durch diesen Rückruf

.

Nicht sicher, wie Sie die erfasste Datenverbindung abfangen würden, oder welche Art von Funktion müssen Sie laufen. Aber Sie können in der Lage sein, die didBeginEditing TextField- Methode zu verwenden, einen Test / Scan durch das Textfeld zu laufen, wenn Sie wissen, was Sie suchen for..such als Textzeichenfolgen zu vergleichen, dass treffen ### - ### - ####-Format, oder beginnen mit „www.“ die Felder zu packen, aber Sie würden ein wenig Code zu schnüffeln durch die Textfelder Zeichenfolge schreiben müssen, reconize, was Sie brauchen, und es dann für die Funktion der Verwendung zu extrahieren. Ich glaube nicht, das so schwer sein würde, wenn Sie genau eingrenzen, was es ist, dass Sie wollten, und dann fokussiert Ihre if () -Anweisung Filter bis zu sehr spezifischen Anpassungsmuster von dem, was man benötigt.

Von couse bedeutet dies, dass der Benutzer die Textbox, um berühren wird den didBeginEditing zu aktivieren (). Wenn das nicht die Art der Interaktion mit dem Benutzer ist, dass Sie suchen Sie nur einen Trigger Timer verwenden könnte, das beginnt bei ViewDidAppear () oder andere je nach Bedarf und verläuft durch die Textfelder Zeichenfolge, dann am Ende der Sie durch das Textfeld String laufen Methoden, die Sie gebaut, schalten Sie einfach den Timer wieder aus.

application:handleOpenURL: aufgerufen wird, wenn eine andere App öffnet Ihre App durch eine URL mit einem Schema der App unterstützt öffnen. Es ist nicht aufgerufen, wenn Ihre Anwendung beginnt eine URL zu öffnen.

ich glaube, der einzige Weg, zu tun, was Vladimir will eine UIWebView anstelle eines UITextView zu verwenden ist. Machen Sie Ihre View-Controller UIWebViewDelegate implementieren, stellen Sie den Delegierten UIWebView auf den View-Controller, und im View-Controller webView:shouldStartLoadWithRequest:navigationType: zu öffnen [request URL] in einer Ansicht, anstatt Ihre Anwendung zu verlassen und öffnen es in Mobile Safari implementieren.

Swift 4:

1) Erstellen Sie die folgende Klasse (Unterklasse UITextView):

import Foundation

protocol QuickDetectLinkTextViewDelegate: class {
    func tappedLink()
}

class QuickDetectLinkTextView: UITextView {

    var linkDetectDelegate: QuickDetectLinkTextViewDelegate?

    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)

    }

    required init?(coder aDecoder: NSCoder) {
         super.init(coder: aDecoder)
    }

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let glyphIndex: Int? = layoutManager.glyphIndex(for: point, in: textContainer, fractionOfDistanceThroughGlyph: nil)
        let index: Int? = layoutManager.characterIndexForGlyph(at: glyphIndex ?? 0)
        if let characterIndex = index {
            if characterIndex < textStorage.length {
                if textStorage.attribute(NSLinkAttributeName, at: characterIndex, effectiveRange: nil) != nil {
                    linkDetectDelegate?.tappedLink()
                    return self
                }
            }
        }

        return nil
    }
}


2) Wo auch immer Sie richten Sie Ihre Textview, dies zu tun:

//init, viewDidLoad, etc
textView.linkDetectDelegate = self

//outlet
@IBOutlet weak var textView: QuickDetectLinkTextView!

//change ClassName to your class
extension ClassName: QuickDetectLinkTextViewDelegate {
    func tappedLink() {
        print("Tapped link, do something")
    }
}


Wenn Sie Storyboard verwenden, stellen Sie sicher, dass Ihr Textview sieht wie folgt aus im rechten Bereich Identitäts Inspektor:
eingeben Bild Beschreibung hier


Voila! Jetzt können Sie den Link tippen erhalten sofort statt, wenn die URL shouldInteractWith URL-Methode

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top