我在UITextView上指定了dataDetectorTypes,以便在触摸时在Safari中打开URL。
是否可以拦截此行为,因此我在UIWebView中加载URL?或者我是否会编写自己的URL检测器代码来重新路由它?
答案 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时都应该调用此方法。在这里,您应该能够在网络视图中打开网址。