iPhone SDK - 在Web视图中打开UITextView中的链接

时间:2009-12-11 16:41:02

标签: iphone uiwebview uitextview datadetectortypes

我在UITextView上指定了dataDetectorTypes,以便在触摸时在Safari中打开URL。

是否可以拦截此行为,因此我在UIWebView中加载URL?或者我是否会编写自己的URL检测器代码来重新路由它?

6 个答案:

答案 0 :(得分:3)

您必须自己进行URL检测,并在点击URL时手动加载UIWebView。

所有内容都需要自定义,因为Apple会向Safari发送所有http://https://个网址。

答案 1 :(得分:2)

上面最好的答案是替换[UIApplication openURL:]的方法实现

实现这一目标的另一种方法是在不使用runtime.h的情况下继承UIApplication。然后,覆盖openURL:选择器。使用这种方法,您可以从您的子类调用[super openURL:],以获取您希望默认处理的URL。它对我来说似乎有点干净,因为你不需要搞乱类的内部方法实现。

如果选择这种方法,还有其他两个重要步骤。在main.m文件中,您需要将第3个参数更改为UIApplicationMain函数调用,以使其与子类的名称匹配:

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

此外,您可能应该将MainWindow.xib文件中的文件所有者的类从UIApplication更改为您的子类。

答案 2 :(得分:1)

我帮助了所有人,并通过博客文章和演示应用程序回答了您的问题。

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

要扩展tt.Kilew的帖子,您可以创建类别,但可以调用您的方法,例如customOpenURL。当你想回到Safari时,你会做一些名为Method Swizzling的事情。它看起来像这样:

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

当你这样做并且不想使用Safari时,只需调用此方法将openURL实现交换为customOpenURL实现。

查看demo app了解更多详情。希望这可以帮助! :)

修改

如果您不想冒着被拒绝的风险,可能需要查看我开发的自定义UITextView以更好地适应这种情况:https://github.com/marksands/MSTextView

答案 3 :(得分:0)

另一个答案:)对我来说很好用的是重新实现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];
}

答案 4 :(得分:0)

Swift版本:

您的标准UITextView设置应该是这样的,不要忘记委托和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)

课程结束后添加这篇文章: 请注意,您需要https://github.com/TransitApp/SVWebViewController这个库,据我所知,这是最好的库。

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

答案 5 :(得分:-2)

您可以尝试在应用程序代理中实现application:handleOpenURL:。 每当打开url时都应该调用此方法。在这里,您应该能够在网络视图中打开网址。