UITextView에서 클릭 링크를 가로채는 방법은 무엇입니까?
사용자가 UITextView에서 자동 탐지된 전화 링크를 터치할 때 사용자 지정 작업을 수행할 수 있습니까?UI WebView를 대신 사용하도록 권장하지 마십시오.
그리고 사과 수업 참고 문헌의 텍스트만 반복하지 마십시오 - 확실히 저는 이미 읽었습니다.
감사해요.
업데이트: 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);
세 번째 매개 변수는 응용 프로그램의 클래스 이름입니다.따라서 이 줄을 다음으로 대체:
int retVal = UIApplicationMain(argc, argv, @"MyApplication", nil);
이것은 저에게 효과가 있었습니다.
iOS 7 이상 버전
다음과 같은 UITextView 위임 방법을 사용할 수 있습니다.
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
사용자가 URL 링크를 누르거나 길게 누르면 텍스트 보기에서 이 메서드를 호출합니다.이 방법의 구현은 선택 사항입니다.기본적으로 텍스트 보기는 URL 유형을 처리하는 응용프로그램을 열고 URL을 전달합니다.이 방법을 사용하여 현재 응용프로그램 내 웹 보기의 URL에 웹 콘텐츠를 표시하는 등의 대체 작업을 트리거할 수 있습니다.
중요:
텍스트 보기의 링크는 텍스트 보기를 선택할 수 있지만 편집할 수 없는 경우에만 대화형입니다.즉, UITextView의 값이 선택 가능한 속성이 YES이고 isEditable 속성이 NO인 경우입니다.
5 및 12에서는 세 중 하여 Swift 5의 12 작용할 수 .UITextView
.
# #1 사용하기 사용하기UITextView
의 재산
와 작용하는 에서 사용할 수 .UITextView
사용하는 것입니다.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
의 방법
사용자 지정 작업을 수행하려는 경우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.Key.link
은 대다음사수있다니습용할을을 할 수 .NSAttributedString
그리고 a를 설정합니다.URL
그것 때문에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
}
}
스위프트 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 설정은 이와 같아야 합니다. 위임자와 dataDetector를 잊지 마십시오.종류들.
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
}
}
스위프트 4:
다음 클래스(하위 분류 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
}
}
텍스트 보기를 설정할 때마다 다음 작업을 수행합니다.
//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")
}
}
스토리보드를 사용하는 경우 오른쪽 창 ID 검사기에서 텍스트 보기가 다음과 같이 나타나는지 확인합니다.
이 Voila여야 할 링크 됩니다.URL과 상호 작용 방법
application:handleOpenURL:
다른 앱이 앱이 지원하는 구성표로 URL을 열어 앱을 열 때 호출됩니다.앱에서 URL을 열기 시작하면 호출되지 않습니다.
블라디미르가 원하는 것을 할 수 있는 유일한 방법은 UItextView 대신 UIWebView를 사용하는 것이라고 생각합니다.구현하게 뷰에 UIWebViewDelegate를 구현합니다. UIWebViewDelegate는 UIWebViewDelegate를 구현합니다.webView:shouldStartLoadWithRequest:navigationType:
펼치기 위해[request URL]
앱을 종료하고 Mobile Safari에서 여는 대신 보기에서 사용할 수 있습니다.
제가 직접 시도해보지는 않았지만, 당신은 구현해 볼 수 있습니다.application:handleOpenURL:
대리자의 - 응프그대의메서드자리보모럼 - 입다니처두용램로▁all▁like▁in▁method다보입처럼 보입니다.openURL
이 콜백을 통과하도록 요청합니다.
탐지된 데이터 링크를 가로채는 방법이나 실행해야 하는 기능 유형을 잘 모르겠습니다.그러나 원하는 것이 무엇인지 알고 있다면 didBeginEditingTextField 메서드를 사용하여 텍스트 필드를 통해 테스트/스캔을 실행할 수 있습니다.예를 들어 ######### 형식을 충족하는 텍스트 문자열을 비교하거나 "www."로 시작하는 텍스트 문자열을 캡처하려면 작은 코드를 작성하여 텍스트 필드 문자열을 스니핑하고 필요한 내용을 재구성한 다음 함수의 사용을 위해 추출해야 합니다.저는 이것이 그렇게 어렵지 않을 것이라고 생각합니다. 일단 당신이 원하는 것을 정확히 좁힌 다음, 당신의 if() 진술이 당신이 필요로 하는 것의 매우 구체적인 일치 패턴으로 필터링되면.
물론 이것은 사용자가 didBeginEditing()을 활성화하기 위해 텍스트 상자를 터치한다는 것을 의미합니다.원하는 유형의 사용자 상호 작용이 아니면 필요에 따라 ViewDidAppear() 또는 기타에서 시작하여 텍스트 필드 문자열을 통해 실행되는 트리거 Timer를 사용할 수 있습니다. 그런 다음 마지막에 작성한 텍스트 필드 문자열 메서드를 실행하면 Timer를 다시 끌 수 있습니다.
언급URL : https://stackoverflow.com/questions/2543967/how-to-intercept-click-on-link-in-uitextview
'programing' 카테고리의 다른 글
프로젝트의 루트 디렉터리에서 텍스트 파일을 읽는 방법은 무엇입니까? (0) | 2023.06.10 |
---|---|
루비에서 &.(앰퍼샌드 도트)는 무엇을 의미합니까? (0) | 2023.06.05 |
소수 자릿수 형식 지정(R) (0) | 2023.06.05 |
장고 모델에서 목록을 저장하는 가장 효율적인 방법은 무엇입니까? (0) | 2023.06.05 |
이미지가 작아도 UITableViewCell의 이미지 보기를 고정 크기로 만드는 방법 (0) | 2023.06.05 |