質問

ユーザーのタッチがUITextViewで電話リンクを自動検出するとき、

は、カスタムアクションを実行することも可能です。代わりのUIWebViewを使用しないようにアドバイスを行ってください。

とAppleクラスの参照からだけでなく、繰り返しテキストを行ってください   - 確かに私はすでにそれを読んだ。

感謝します。

役に立ちましたか?

解決

更新:に、

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

からとその後UITextViewは、デリゲートを持っています方法:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange *NS_DEPRECATED_IOS(7_0, 10_0, "Use textView:shouldInteractWithURL:inRange:forInteractionType: instead");*
リンクにクリックを傍受する

。そして、これはそれを行うための最善の方法である。

とする以前の良い方法これはUIApplicationをサブクラス化し、

-(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

あなたは、デリゲートにopenURL:を実装する必要があります。

さて、UIApplicationの新しいサブクラスを使用してアプリケーションの起動を持つように、プロジェクト内のファイルmain.mを探します。

:あなたのアプリをブートストラップし、この小さなファイルでは、このラインは通常あり
int retVal = UIApplicationMain(argc, argv, nil, nil);

3番目のパラメータは、アプリケーションのクラス名です。ですから、この行を置き換えます:

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

これは私のためのトリックをやっています。

他のヒント

でのiOS 7以降

あなたは、次のUITextViewデリゲートメソッドを使用することができます:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
ユーザータップまたはロングプレスURLリンク場合は、

は、テキストビューは、このメソッドを呼び出します。このメソッドの実装はオプションです。デフォルトでは、テキストビューは、URLのタイプを処理するための責任のアプリケーションを開いて、それにURLを渡します。あなたは、現在のアプリケーション内のWebビューのURLでWebコンテンツを表示するなど、代替アクションをトリガーするために、このメソッドを使用することができます。

重要:

  

テキストビュー内のリンクは、テキストビューがある場合にのみ、インタラクティブです   選択が、編集できません。つまり、もしUITextViewの値   選択可能なプロパティがYESであるとisEditableをプロパティはNOです。

スイフト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
    }
}

またはターゲットである場合> = IOS 10

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

スウィフトのバージョン:

あなたの標準UITextViewの設定がデリゲートと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)

クラスの端がこの作品を追加した後:

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
    }
}

スウィフト5とiOS 12で、あなたはUITextView内のリンクと対話するために、以下の三つのパターンのいずれかを使用することができます。

<時間>

#1。 UITextView dataDetectorTypes のプロパティを使用した。

UITextViewに電話番号、URLまたはアドレスと対話するための最も簡単な方法はdataDetectorTypesプロパティを使用することです。それを実装する方法を示し、以下のサンプルコード。ユーザーが電話番号をタップしたときに、このコードでは、UIAlertControllerがポップアップ表示されます。

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。使用UITextViewDelegate textView(_:shouldInteractWith:in:interaction:) の方法

あなたが代わりにUIAlertControllerを使用しているときに電話番号をタップしたときにdataDetectorTypesがポップアップすることのいくつかのカスタムアクションを実行したい場合は、

は、あなたのUIViewControllerUITextViewDelegateプロトコルに準拠して作成し、textView(_:shouldInteractWith:in:interaction:)を実装する必要があります。それを実装する方法を示し、以下のコード:

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。使用 NSAttributedString NSAttributedString.Key.link

別の方法として、あなたはNSAttributedStringを使用し、そのURLショー以下attribute.Theサンプルコードことの可能な実施のためのNSAttributedString.Key.linkを設定することができます。ユーザーが属性付き文字列をタップすると、このコードでは、UIAlertControllerがポップアップ表示されます。

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
    }

}
私は自分自身が、あなたはあなたのアプリケーションのデリゲートにapplication:handleOpenURL:メソッドを実装しようとすることができることをしようとしていない - それは、このコールバックを介してすべてのopenURL要求パスのように見えます。

わからないあなたが検出されたデータリンク、または関数の種類、あなたが実行する必要があるを傍受だろうか。 、####形式 - ### - しかし、あなたはあなたがテキスト文字列その出会いを###比較などfor..such探して何を知っていれば、テキストフィールドを通じてスキャンテストを/実行するためにdidBeginEditingのTextFieldメソッドを利用することができるかもしれませんまたはで始まる「WWW。」これらのフィールドをつかむために、しかし、あなたは、テキストフィールドの文字列を通じてスニフに少しコードを書く必要なものreconize、その後、あなたの関数の使用のためにそれを抽出する必要があります。あなたはそれはあなたが望んでいたし、次に()文はあなたが必要なものの非常に具体的なマッチングパターンにダウンフィルタリングした場合、あなたに焦点を当てていることです正確に何を絞り込んたら、私は、これはその難しいだろうとは思いません。

このクーゼの

は、ユーザーが)(didBeginEditingを活性化するために、テキストボックスに触れるために起こっていることを意味します。それがユーザーとの対話のタイプではない場合、あなただけのテキストフィールドの文字列による必要性と実行に基づいてViewDidAppear()または他の開始は、その後の終わりに、あなたがテキストフィールドの文字列を介して実行することを、トリガータイマーを使用する可能性があるため、あなたが探していました方法は、あなたが構築されていること、あなただけのタイマーバックをオフにします。

他のアプリがスキームアプリサポートでURLを開いて、の自分ののアプリを開いたときに

application:handleOpenURL:が呼び出されます。あなたのアプリがURLを開く始まるときに呼び出されていない。

私はウラジミールが望んでいるものを行うための唯一の方法は、UITextViewの代わりにのUIWebViewを使用することだと思います。あなたのビューコントローラがUIWebViewDelegateを実装してください、ビューコントローラへのUIWebViewのデリゲートを設定し、ビューコントローラに代わりにアプリを終了し、モバイルSafariでそれを開くの観点からオープンwebView:shouldStartLoadWithRequest:navigationType:[request URL]を実装します。

スイフト4:

1)下記クラス(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
    }
}


あなたのTextViewを設定どこ2)は、次の操作を行います

//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")
    }
}


あなたはストーリーボードを使用している場合は、右ペインのアイデンティティインスペクタでこのようなことを確認あなたのTextViewのルックスを作る:
ここに画像の説明を入力



出来上がり!今、あなたは、リンクタップを取得するのではなく、ただちにときURL shouldInteractWith URLメソッド

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top