どのように切片にUITextViewのリンクをクリックしてください?
-
23-09-2019 - |
質問
は、カスタムアクションを実行することも可能です。代わりのUIWebViewを使用しないようにアドバイスを行ってください。
とAppleクラスの参照からだけでなく、繰り返しテキストを行ってください - 確かに私はすでにそれを読んだ。
。感謝します。
解決
更新: ios10 に、
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction;
から ios7 とその後UITextView
は、デリゲートを持っています方法:
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange *NS_DEPRECATED_IOS(7_0, 10_0, "Use textView:shouldInteractWithURL:inRange:forInteractionType: instead");*
リンクにクリックを傍受する。そして、これはそれを行うための最善の方法である。
ios6 とする以前の良い方法これは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です。
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
がポップアップすることのいくつかのカスタムアクションを実行したい場合は、は、あなたのUIViewController
がUITextViewDelegate
プロトコルに準拠して作成し、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()または他の開始は、その後の終わりに、あなたがテキストフィールドの文字列を介して実行することを、トリガータイマーを使用する可能性があるため、あなたが探していました方法は、あなたが構築されていること、あなただけのタイマーバックをオフにします。
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メソッド