Frage

Ich habe angegeben dataDetectorTypes auf einem UITextView so dass URLs in Safari öffnen, wenn sie berührt.

Ist es möglich, dieses Verhalten abzufangen, damit ich die URL in einem UIWebView stattdessen laden? Oder würde ich habe meine eigene URL Detektor Code schreiben, um eine neue Route das?

War es hilfreich?

Lösung

würden Sie haben die URL-Erkennung selbst zu tun und manuell die UIWebView geladen werden, wenn die URL abgegriffen wird.

Alles muss zu kunden getan weil Apple alle http:// und https:// URL Öffnungen Safari sendet.

Andere Tipps

Die Antwort über das funktioniert am besten ist der Ersatz von Methodenimplementierung für [UIApplication openURL:]

Eine andere Möglichkeit, das zu erreichen, ohne runtime.h zu verwenden ist UIApplication Unterklasse. Dann überschreibt die openURL: Wähler. Mit diesem Ansatz können Sie [super openURL:] rufen Sie aus der Unterklasse für URLs Sie die Standardeinstellung für die Handhabung möchten. Es scheint auch ein wenig sauberer zu mir, da Sie nicht mit den internen Verfahren Implementierungen der Klassen zu Chaos brauchen.

Wenn Sie diesen Ansatz wählen, obwohl, gibt es zwei weitere wichtige Schritte. In der main.m Datei benötigen Sie das dritte Argument des UIApplicationMain Funktionsaufruf zu ändern, so dass es den Namen Ihrer Unterklasse entspricht:

int retVal = UIApplicationMain(argc, argv, @"MyApplicationSubclass", nil);

Außerdem sollten Sie wahrscheinlich die Klasse Änderung der Management-Datei in Ihrer MainWindow.xib Datei von UIApplication zu Ihrer Unterklasse.

Ich habe alle einen Gefallen und beantworten Ihre Frage mit einer Blog-Post und Demo-Anwendung.

http://52apps.net/post/879106231/method-swizzling-uitextview-and-safari http://github.com/marksands/UITextViewLinkOptions

auf tt.Kilew der Post zu erweitern, erstellen Sie die Kategorie, aber Ihre Methode etwas anderes wie customOpenURL nennen. Wenn Sie zurück zu Safari gehen wollen tun Sie etwas Methode Swizzling genannt. Es sieht wie folgt aus:

#import <objc/runtime.h>
..
Method customOpenUrl = class_getInstanceMethod([UIApplication class], @selector(customOpenURL:));
Method openUrl = class_getInstanceMethod([UIApplication class], @selector(openURL:));
method_exchangeImplementations(customOpenUrl, openUrl);

Nur diese Methode aufrufen, die openURL Implementierung mit Ihrem customOpenURL Implementierung zu tauschen, wenn Sie und wollen nicht Safari verwenden.

Schauen Sie sich die Demo-Anwendung für mehr Details. Hoffe das hilft! :)

Bearbeiten

Wenn Sie nicht möchten, dass Ihre App riskieren immer abgelehnt, möchten Sie vielleicht eine Gewohnheit überprüfen UITextView ich entwickelt, um die Situation besser zu passen: https://github.com/marksands/MSTextView

Eine andere Antwort :) Das ist für mich gut funktioniert ist neu implementieren UIApplication openURL: (NSURL *) url

@interface UIApplication (Private)

- (BOOL)openURL:(NSURL*)url;

@end

@implementation UIApplication (Private)

- (BOOL)openURL:(NSURL*)url {
   // all viewcontrollers should change currentViewController to self
   if ([MyWatcher currentViewController]) {
      // Do anything you want
      [[MyWatcher handleURL:url withController:[MyWatcher currentViewController]];
      return YES;
   }
   return NO;
}

@end

... Some view controller
- (void)viewDidLoad {
   [super viewDidLoad];
   [MyWatcher setCurrentController:self];
}

Swift-Version:

Ihr Standard UITextView Setup wie folgt aussehen sollte, nicht zu vergessen die Delegierten und 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)

Nach Ihrer Klasse endet dieses Stück hinzufügen: Beachten Sie, dass Sie benötigen, https://github.com/TransitApp/SVWebViewController dieser Bibliothek, die die beste ist da draußen so weit ich weiß.

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
    }
}

Sie können versuchen, application:handleOpenURL: in Ihrer Anwendung Delegierten zu implementieren. Diese Methode sollte aufgerufen werden, wenn eine URL geöffnet wird. Hier sollten Sie in der Lage sein, um die URL zu machen, öffnet in Ihrem Webansicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top