当设定了文本内容的链接高亮事件监听后,UIApplication将对点击事件做出responser,比如调用safari处理http文本,如果要改变这种响应方法。怎么做?
Method1、
使用类别override UITextView的webView:decidePolicyForNavigationAction:request:frame:decisionListener:方法。
@interface UITextView (CommonOverrid)
@end
@class WebView, WebFrame;
@protocol WebPolicyDecisionListener;
@implementation UITextView (CommonOverrid)
- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id < WebPolicyDecisionListener >)listener
{
NSLog(@"request: %@", request);
UIWebView *v1 = [[UIWebView alloc] initWithFrame:CGRectMake(0, self.superview.frame.size.height - 200, 764, 200)];
[v1 loadRequest:request];
[((UIView *)(self.superview)) addSubview:v1];
}
UITextView增加了类别,重写了方法。但必须注意这是一个private API。如果内部框架调整可能导致实效。
Method2、
重写UIApplication openURL方法
@implementation UIApplication (Private)
- (BOOL)openURL:(NSURL*)url
{
//current delegate
MyAppDelegate *watcher = [[UIApplication sharedApplication] delegate];
//current controller,use it to handleURL the action
if (watcher.currentViewController) {
//do something here....
[watcher.currentViewController handleURL:url];
return YES;
}
return NO;
}
@end
还有个实现不通过重写方法,而是先命名别称然后交换方法实现。swap implementations between separate methods.
Method customOpenUrl = class_getInstanceMethod([UIApplication class], @selector(customOpenURL:));
Method openUrl = class_getInstanceMethod([UIApplication class], @selector(openURL:));
method_exchangeImplementations(customOpenUrl, openUrl);
所以总结下来还是推荐使用第二种方法。
详见地址:https://github.com/marksands/UITextViewLinkOptions