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

iPhone SDK-在web视图中打开UITextView中的链接,iphone,uiwebview,uitextview,datadetectortypes,Iphone,Uiwebview,Uitextview,Datadetectortypes,我已经在UITextView上指定了dataDetectorTypes,以便在触摸时在Safari中打开URL 是否有可能拦截这种行为,因此我将URL加载到UIWebView中?或者,我是否需要编写自己的URL检测器代码来重新路由此任务?您可以尝试在应用程序委托中实现应用程序:handleAppUrl:。 只要打开url,就应该调用此方法。在这里,您应该能够在Web视图中打开URL。您必须自己进行URL检测,并在点击URL时手动加载UIWebView 一切都需要定制,因为苹果将所有http://

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


是否有可能拦截这种行为,因此我将URL加载到UIWebView中?或者,我是否需要编写自己的URL检测器代码来重新路由此任务?

您可以尝试在应用程序委托中实现
应用程序:handleAppUrl:

只要打开url,就应该调用此方法。在这里,您应该能够在Web视图中打开URL。

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

一切都需要定制,因为苹果将所有
http://
https://
URL打开发送到Safari。

另一个答案:)对我来说很好的方法是重新实现UIApplication openURL:(NSURL*)URL


我帮了大家一个忙,用博客和演示应用回答了你们的问题

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

为了在tt.Kilew的帖子上展开,您创建了类别,但将您的方法称为其他方法,例如
customOpenURL
。当你想回到Safari时,你可以做一些叫做方法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);
#导入
..
方法customOpenUrl=class_getInstanceMethod([UIApplication class],@selector(customOpenUrl:);
方法openUrl=class_getInstanceMethod([UIApplication class],@selector(openUrl:);
方法交换实现(customOpenUrl、openUrl);
只要调用此方法,就可以在使用和不使用Safari时,将
openURL
实现与
customOpenURL
实现交换

有关更多详细信息,请查看。希望这有帮助!:)

编辑
如果您不想冒应用被拒绝的风险,您可能希望查看我为更好地适应这种情况而开发的自定义UITextView:

以上最有效的答案是将[UIApplication openURL:]的方法实现替换为[UIApplication openURL:]

另一种不使用runtime.h的方法是将UIApplication子类化。然后,覆盖openURL:selector。使用这种方法,您可以从子类中调用[super-openURL:],以获得您想要默认处理的URL。对我来说,这似乎也有点干净,因为您不需要处理类的内部方法实现

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

int retVal = UIApplicationMain(argc, argv, @"MyApplicationSubclass", nil);
此外,您可能应该将MainWindow.xib文件中文件所有者的类从UIApplication更改为子类。

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)
课程结束后,添加以下内容: 请注意,您需要这个库,据我所知,它是最好的库

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

对于那些希望在整个应用程序中都有自己的实现的人来说,这非常有效。我发现它真的很有用很好-不知道最近是否有什么变化,但是有人的应用程序使用了Three20框架,因为方法切换而被拒绝(我相信Three20已经更新为不再使用它)。没错!我开始实现一个定制的UITextView来更好地处理URL。这种方法效果更好,不会被苹果拒绝。你可以在这里查看我发现的这个链接,它将告诉你MyWatcher是什么-我只是在寻找答案时偶然发现它-如果我这样做,苹果会拒绝该应用程序吗?让我担心的是“隐私”。它在这里做什么?你可以用任何你喜欢的方式命名类别。openURL根本不是私有方法。另一种选择是使用自己的实现对UIApplication进行子类化,并使用方法而不是类别
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
    }
}