How to open UITextView web links in a UIWebView instead of Safari?

前端 未结 3 2024
孤独总比滥情好
孤独总比滥情好 2020-12-28 08:32

I\'m developing and iPhone 3.0 application. And I\'m trying to open web links in a UITextView into a UIWebView instead of Safari. But still no luck.

The UIText

3条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-28 08:52

    With Swift 3, UITextViewDelegate provides a textView(_:shouldInteractWith:in:interaction:) method. textView(_:shouldInteractWith:in:interaction:) has the following declaration:

    Asks the delegate if the specified text view should allow the specified type of user interaction with the given URL in the given range of text.

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

    The following code shows how to open UITextView web links in a SFSafariViewController instead of opening them in Safari app:

    import UIKit
    import SafariServices
    
    class ViewController: UIViewController, UITextViewDelegate {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Set textView
            let textView = UITextView()
            textView.text = "http://www.yahoo.fr http://www.google.fr"
            textView.isUserInteractionEnabled = true
            textView.isEditable = false
            textView.isSelectable = true
            textView.dataDetectorTypes = UIDataDetectorTypes.link
    
            // Add view controller as the textView's delegate
            textView.delegate = self
    
            // auto layout
            view.addSubview(textView)
            textView.translatesAutoresizingMaskIntoConstraints = false
            textView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
            textView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
            textView.heightAnchor.constraint(equalToConstant: 300).isActive = true
            textView.widthAnchor.constraint(equalToConstant: 300).isActive = true
        }
    
        func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
            // Open links with a SFSafariViewController instance and return false to prevent the system to open Safari app
            let safariViewController = SFSafariViewController(url: URL)
            present(safariViewController, animated: true, completion: nil)
    
            return false
        }
    
    }
    

提交回复
热议问题