본문 바로가기
🌱

URL textView에 연결

by 방우 2022. 7. 30.

UIDataDetectorTypes

  • 텍스트 기반 콘텐츠에서 감지할 정보 유형을 정의하는 상수
  • UIDataDetectorTypes가 감지할 수 있는 정보 유형은 phoneNumber, link, address, calendarEvent, shipmentTrackingNumber, flightNumber, lookupSuggestion, all 이 있다.
  • 🔺" 이 속성을 사용하여 텍스트 보기에서 URL로 자동으로 변환해야 하는 데이터 유형(전화 번호, http 링크 등)을 지정할 수 있습니다. 탭하면, 텍스트 보기는 URL 유형을 처리하는 애플리케이션을 열고 URL을 전달합니다. 텍스트 뷰의 isEditable 속성이 true로 설정된 경우 데이터 감지가 발생하지 않습니다. "

앱 외부에서 열기

  • func textView(\_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool
    • : 지정된 텍스트 보기가 지정된 텍스트 범위에서 지정된 URL과 지정된 유형의 사용자 상호 작용을 허용하는지 여부를 대리자에게 묻는 메서드
    • 🔺 Link는 선택가능해야 웹으로 연결하든, 어떤 액션을 취할 수 있으니 textView.isSelectable속성을 true로 설정해주어야 하고, 위에 다뤘던 isEditable속성은 false로 설정
    • " 이 메서드는 URL 링크와의 첫 번째 상호 작용에서만 호출됩니다. 예를 들어, 이 메서드는 사용자가 URL과의 첫 번째 상호 작용을 통해 수행할 수 있는 작업 목록을 표시하려는 경우 호출됩니다. 사용자가 목록에서 열기 작업을 선택하면 "open"이 동일한 URL과의 두 번째 상호 작용을 나타내므로 이 메서드가 호출되지 않습니다. "
      • TextItemInteraction는 UITextItemInteraction타입의 value를 가진다. 타입은 case invokeDefaultAction = 0, case presentActions = 1, case preview = 2 이렇게 구성된다.
      • 블로그를 보면 어떻게 작동하는지 알 수 있다.
      • textView의 대리자를(delegate) 위임해주고, UITextViewDelegate 프로토콜을 채택해주면 텍스트뷰 내 URL link와 interaction하는. 메서드를 사용할 수 있다.

앱 내부에서 열기

import SafariServices를 하고 위의 함수를 이용하여 앱 내부에서 URL을 연결할 수 있다.

import SafariServices
import UIKit

class LinkViewController: UIViewController, UITextViewDelegate {
    @IBOutlet weak var testLabel: UILabel! // 링크연결에 필요한코드 아님
    @IBOutlet weak var testTextView: UITextView! {
        didSet {
            testTextView.delegate = self
            testTextView.text = "참고블로그 https://g-y-e-o-m.tistory.com/158"
            testTextView.isSelectable = true
            testTextView.isEditable = false
            testTextView.dataDetectorTypes = .link
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        testLabel.attributedText = label.attributedText // 이걸 필수적으로 넣어줘야 반영(link연결에 필요한 코드 아님)
    }

    //MARK: dataDetectirTypes
    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
        let safari: SFSafariViewController = SFSafariViewController(url: URL)
        self.present(safari, animated: true) {
            print("인앱")
        }
//        interaction.rawValue == 0
//        print("interactionCase", interaction.rawValue == 1)
        return false
    }
}

 

 

'🌱' 카테고리의 다른 글

데이터 통신과 테이블 뷰 트러블슈팅  (0) 2022.08.09
separator inset 적용  (0) 2022.08.08
SearchBar/URL 연결  (0) 2022.07.30
Notification 앱푸쉬  (0) 2022.07.30
switch 배경색과 여백  (0) 2022.07.21