点击一个textView里的link导航至程序内可返回的自定义webView
1,在AppDelegate.h里定义一个
id currentViewController;
在AppDelegate.m里
@implementation UIApplication (Private)
- (BOOL)customOpenURL:(NSURL*)url
{
beautyAppDelegate *MyWatcher = [[UIApplication sharedApplication] delegate];
if (MyWatcher.currentViewController) {
[MyWatcher.currentViewController handleURL:url];
return YES;
}
return NO;
}
@end
- (void)applicationDidBecomeActive:(UIApplication *)application {
Method customOpenUrl = class_getInstanceMethod([UIApplication class],@selector(customOpenURL:));
Method openUrl = class_getInstanceMethod([UIApplication class], @selector(openURL:));
method_exchangeImplementations(openUrl, customOpenUrl);
}
在某个viewController里 AppDelegate.currentViewController = self;
在viewController里定义一个 -(void)handleURL:(NSURL*)url,在这个函数里加载一个自定义的webView;
当viewController里有某个链接url用户点击时就会回调AppDelegate的- (BOOL)customOpenURL:(NSURL*)url;
自定义的webView代码如下:
WebViewController.h里
#import <UIKit/UIKit.h>
@interface WebViewController : UIViewController <UIActionSheetDelegate, UIWebViewDelegate> {
UIWebView *webView;
NSURL *url;
UIToolbar* toolbar;
UIBarButtonItem *backButton;
UIBarButtonItem *forwardButton;
UIBarButtonItem *actionButton;
}
@property (nonatomic, retain) UIWebView *webView;
@property (nonatomic, retain) NSURL *url;
@property (nonatomic, retain) UIToolbar* toolbar;
@property (nonatomic, retain) UIBarButtonItem *backButton;
@property (nonatomic, retain) UIBarButtonItem *forwardButton;
@property (nonatomic, retain) UIBarButtonItem *actionButton;
- (id) initWithURL:(NSURL*)u;
- (void) doAction;
- (void)goBack;
- (void)goForward;
- (void)reload;
- (void)stop;
@end
WebViewController.m里:
#import <objc/runtime.h>
#import "beautyAppDelegate.h"
#import "WebViewController.h"
typedef enum {
BUTTON_RELOAD,
BUTTON_STOP,
} ToolbarButton;
@interface WebViewController (Private)
- (void)updateToolbar:(ToolbarButton)state;
@end;
@implementation WebViewController
@synthesize webView;
@synthesize url;
@synthesize toolbar, backButton, forwardButton, actionButton;
- (id) initWithURL:(NSURL *)u
{
if ( (self = [super init]) )
{
backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back.png"]style:UIBarButtonItemStylePlain target:self action:@selector(goBack)];
forwardButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"forward.png"]style:UIBarButtonItemStylePlain target:self action:@selector(goForward)];
actionButton = [[UIBarButtonItemalloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:selfaction:@selector(doAction)];
toolbar = [UIToolbar new];
toolbar.barStyle = UIBarStyleDefault;
toolbar.tintColor = [UIColor lightGrayColor];
[toolbar sizeToFit];
CGFloat toolbarHeight = [toolbar frame].size.height;
CGRect mainViewBounds = self.view.bounds;
[toolbar setFrame:CGRectMake(CGRectGetMinX(mainViewBounds),
CGRectGetMinY(mainViewBounds) + CGRectGetHeight(mainViewBounds) - (toolbarHeight * 2.0) + 2.0,
CGRectGetWidth(mainViewBounds),
toolbarHeight)];
webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 380)];
webView.delegate = self;
webView.scalesPageToFit = YES;
url = [u copy];
[self.view addSubview:webView];
[self.view addSubview:toolbar];
UIBarButtonItem *flexItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
NSArray *items = [NSArray arrayWithObjects: flexItem, backButton, flexItem, flexItem, flexItem,forwardButton,
flexItem, flexItem, flexItem, flexItem, flexItem, flexItem,
actionButton, flexItem, flexItem, flexItem,actionButton, flexItem, nil];
[self.toolbar setItems:items animated:NO];
[webView loadRequest:[NSURLRequest requestWithURL:url]];
}
return self;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[webView stopLoading];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
#pragma mark -
#pragma mark WebViewActions
- (void)reload
{
[webView reload];
[self updateToolbar:BUTTON_STOP];
}
- (void)stop
{
[webView stopLoading];
[self updateToolbar:BUTTON_RELOAD];
}
- (void) goBack
{
[webView goBack];
}
- (void) goForward
{
[webView goForward];
}
- (void) doAction
{
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:[self.url absoluteString]
delegate:self
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:nil
otherButtonTitles:@"Open with Safari", nil];
[actionSheet showInView:self.navigationController.view];
[actionSheet release];
}
- (void)actionSheet:(UIActionSheet *)as clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (as.cancelButtonIndex == buttonIndex) return;
if (buttonIndex == 0) {
// swizzle methods, from here we want to open Safari
Method customOpenUrl = class_getInstanceMethod([UIApplication class],@selector(customOpenURL:));
Method openUrl = class_getInstanceMethod([UIApplication class], @selector(openURL:));
method_exchangeImplementations(customOpenUrl, openUrl);
[[UIApplication sharedApplication] openURL:self.url];
}
}
#pragma mark -
#pragma mark UIWebView
- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
return true;
}
- (void)webViewDidStartLoad:(UIWebView *)aWebView
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
[self updateToolbar:BUTTON_STOP];
}
- (void)webViewDidFinishLoad:(UIWebView *)aWebView
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
self.title = [aWebView stringByEvaluatingJavaScriptFromString:@"document.title"];
[self updateToolbar:BUTTON_RELOAD];
self.url = aWebView.request.mainDocumentURL;
}
- (void)webView:(UIWebView *)aWebView didFailLoadWithError:(NSError *)error
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
-(void)updateToolbar:(ToolbarButton)button
{
NSMutableArray *items = [toolbar.items mutableCopy];
UIBarButtonItem *newItem;
if (button == BUTTON_STOP) {
UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
[activityView startAnimating];
newItem = [[UIBarButtonItem alloc] initWithCustomView:activityView];
[activityView release];
}
else {
newItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefreshtarget:self action:@selector(reload)] autorelease];
}
[items replaceObjectAtIndex:12 withObject:newItem];
[toolbar setItems:items animated:false];
[items release];
// workaround to change toolbar state
backButton.enabled = true;
forwardButton.enabled = true;
backButton.enabled = false;
forwardButton.enabled = false;
backButton.enabled = (webView.canGoBack) ? true : false;
forwardButton.enabled = (webView.canGoForward) ? true : false;
}
#pragma mark -
- (void)dealloc
{
[webView release];
[url release];
[toolbar release];
[backButton release];
[forwardButton release];
[actionButton release];
[super dealloc];
}
@end
本文转载至 http://blog.csdn.net/zhuangyou123/article/details/6936850
点击一个textView里的link导航至程序内可返回的自定义webView的更多相关文章
- TextView里的文 html
一.[Android实例]实现TextView里的文字有不同颜色 转eoe:http://www.eoeandroid.com/thread-4496-1-1.html import android. ...
- 为Textview里面的ImageSpan添加点击响应事件
对于图文混排的TextView,用户在浏览到里面的图片的时候,往往有点击图片preview大图或者preview之后保存图片的需求,这就需要为Textview里面的ImageSpan设置点击响应事件. ...
- Android TextView 嵌套图片及其点击,TextView 部分文字点击,文字多颜色
1. TextView 中嵌套图片的方法 TextView textView... textView.setText("..."); textView.append(Html.fr ...
- Android TextView里显示两种颜色
今天介绍一个小技巧,在Android的TextView里设置两种颜色,直接上代码: TextView TV = (TextView)findViewById(R.id.mytextview01); S ...
- 高效快捷解决一个TextView显示多种字体的控件SpannableTextView
这个控件本人强烈推荐,它会使得布局非常的简单且高效: 下面这个布局如果是你,你会用多少层?多少控件生成? 告诉你吧,一个SpannableTextView控件就搞定了! 它把TextView和Span ...
- Android 获取imageview的图,在另一个imageview里显示。
当我点击默认头像里的其中一个然后在点确定就在最上面的那个imageview里显示选择的头像.求大神. img1和img2都是ImageView,要把img1中的图片显示到img2中 前景(对应src属 ...
- 【移动端debug-6】如何做一个App里的web调试小工具
原文链接:如何做一个App里的web调试小工具 我们知道现在hybrid app非常流行,在这样的app里,h5页面是应用非常广泛的.相对于以往在pc端开发的网页,放在app里的网页由于无法直接使用桌 ...
- 浅谈android中只使用一个TextView实现高仿京东,淘宝各种倒计时
今天给大家带来的是只使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.近期公司一直加班也没来得及时间去整理,今天难得歇息想把这个分享给大家.只求共同学习,以及自己兴许 ...
- Android 一个TextView中设置多种不同大小的字体,设置超链接
以前项目中要是遇到这样的UI设计,都是傻不拉唧的分为三个TextView来实现,今天在微信中无意中看了一篇公众号文章,发现原来只要一个TextView就可以搞定啦,人生最悲哀的事情莫过于工作了这么久啦 ...
随机推荐
- iOS网络NSURLConnection使用详解
一.整体介绍 NSURLConnection是苹果提供的原生网络访问类,但是苹果很快会将其废弃,且由NSURLSession(iOS7以后)来替代.目前使用最广泛的第三方网络框架AFNetworkin ...
- 基于jquery的可拖动div
昨天给大家介绍了一款基于jquery ui漂亮的可拖动div实例,今天要给大家分享一款基于jquery的可拖动div.这款可拖动div只要引用jquery就可以,无需引用jquery ui.还实时记录 ...
- 关于Java开发过程中质量提升-2自动化
开发人员写代码过程中就实现自动代码检视,编辑器会提示编码规范错误,并给出正确实例,写完代码只需要提交到SVN库,然后启动自动化构建(可配置代码提交SVN后自动触发),测试环境中的项目马上和当前SVN库 ...
- Jackson2.1.4 序列化对象时对属性的过滤
//对field(所有字段)进行过滤 //对get方法进行过滤 //对isBoolean这样的方法进行过滤 //里面的具体配置有 ANY,DEFAULT,NON_PRIVATE,NONE,PROTEC ...
- ftp的主动模式active mode和被动模式 passive mode的配置和区别
ftp的主动模式active mode和被动模式 passive mode的配置和区别 2017年05月08日 17:47:16 阅读数:21768 本文主要记录的是在linux上的区别,弄了一整天才 ...
- DataRowState、AcceptChanges、RejectChanges综合使用示例:实现DataGridView数据的增、删、改
下面的示例中,通过一个程序,演示使用DataRowState.AcceptChanges.RejectChanges,实现DataGridView数据的增.删.改. 一.界面设计 二.代码实现 usi ...
- Jquery easyui教程
目 录 1基本拖放.......................................................................................... ...
- Python python的输入输出
#-*- coding:utf-8 -*- #屏蔽中文乱码方案一(官方推荐) #这个语句必须顶行写 #屏蔽中文乱码方案二(不建议使用) '''#coding=utf-8 ''' #input(),输入 ...
- 关于Cocos2d-x项目运行的过程和场景切换步骤
1.AppDelegate.cpp文件里面的applicationDidFinishLaunching函数其实可以看做C语言里面的main函数,是整个游戏运行的入口 这个函数里面的语句 auto sc ...
- 【转】【Linux】Linux 命令行快捷键
Linux 命令行快捷键 涉及在linux命令行下进行快速移动光标.命令编辑.编辑后执行历史命令.Bang(!)命令.控制命令等.让basher更有效率. 常用 ctrl+左右键:在单词之间跳转 ct ...