Как открыть веб-ссылки UITextView в UIWebView вместо Safari? - PullRequest
15 голосов
/ 20 августа 2009

Я занимаюсь разработкой приложения для iPhone 3.0. И я пытаюсь открыть веб-ссылки в UITextView в UIWebView вместо Safari. Но все равно не повезло.

UITextView не редактируется, и он отлично обнаруживает веб-ссылки и открывает их в Safari.

Как этого избежать? Как получить этот URL, чтобы я мог использовать его с UIWebView?

Ответы [ 3 ]

20 голосов
/ 17 ноября 2013

Это старый вопрос, но если кто-то ищет обновленный способ сделать это.

Назначьте ваш viewController, который содержит UITextView, в качестве делегата в файле .m вашего viewController и просто добавьте:

-(BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange{

    //Do something with the URL
    NSLog(@"%@", URL);


    return NO;
}
7 голосов
/ 20 августа 2009

Самый простой способ - переопределить метод webView:decidePolicyForNavigationAction:request:frame:decisionListener: на UITextView, например так:

@interface UITextView (Override)
@end

@class WebView, WebFrame;
@protocol WebPolicyDecisionListener;

@implementation UITextView (Override)

- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id < WebPolicyDecisionListener >)listener
{
    NSLog(@"request: %@", request);
}
@end

Это повлияет на все UITextView в вашем приложении. Если это требуется только для одного представления, создайте подкласс и переопределите метод для этого.

Примечание: это технически закрытый API, который можно удалить в любое время. Это невозможно сделать через общедоступный API.

edit: с iOS 7.0 для UITextViewDelegate был добавлен новый метод. Подробности смотрите в ответе nihad.

5 голосов
/ 24 января 2017

С Swift 3 UITextViewDelegate обеспечивает метод textView(_:shouldInteractWith:in:interaction:). textView(_:shouldInteractWith:in:interaction:) имеет следующую декларацию:

Спрашивает делегата, должно ли указанное текстовое представление разрешать указанный тип взаимодействия пользователя с данным URL в заданном диапазоне текста.

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

В следующем коде показано, как открыть UITextView веб-ссылки в SFSafariViewController вместо их открытия в приложении Safari:

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
    }

}
...