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的更多相关文章

  1. TextView里的文 html

    一.[Android实例]实现TextView里的文字有不同颜色 转eoe:http://www.eoeandroid.com/thread-4496-1-1.html import android. ...

  2. 为Textview里面的ImageSpan添加点击响应事件

    对于图文混排的TextView,用户在浏览到里面的图片的时候,往往有点击图片preview大图或者preview之后保存图片的需求,这就需要为Textview里面的ImageSpan设置点击响应事件. ...

  3. Android TextView 嵌套图片及其点击,TextView 部分文字点击,文字多颜色

    1. TextView 中嵌套图片的方法 TextView textView... textView.setText("..."); textView.append(Html.fr ...

  4. Android TextView里显示两种颜色

    今天介绍一个小技巧,在Android的TextView里设置两种颜色,直接上代码: TextView TV = (TextView)findViewById(R.id.mytextview01); S ...

  5. 高效快捷解决一个TextView显示多种字体的控件SpannableTextView

    这个控件本人强烈推荐,它会使得布局非常的简单且高效: 下面这个布局如果是你,你会用多少层?多少控件生成? 告诉你吧,一个SpannableTextView控件就搞定了! 它把TextView和Span ...

  6. Android 获取imageview的图,在另一个imageview里显示。

    当我点击默认头像里的其中一个然后在点确定就在最上面的那个imageview里显示选择的头像.求大神. img1和img2都是ImageView,要把img1中的图片显示到img2中 前景(对应src属 ...

  7. 【移动端debug-6】如何做一个App里的web调试小工具

    原文链接:如何做一个App里的web调试小工具 我们知道现在hybrid app非常流行,在这样的app里,h5页面是应用非常广泛的.相对于以往在pc端开发的网页,放在app里的网页由于无法直接使用桌 ...

  8. 浅谈android中只使用一个TextView实现高仿京东,淘宝各种倒计时

    今天给大家带来的是只使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.近期公司一直加班也没来得及时间去整理,今天难得歇息想把这个分享给大家.只求共同学习,以及自己兴许 ...

  9. Android 一个TextView中设置多种不同大小的字体,设置超链接

    以前项目中要是遇到这样的UI设计,都是傻不拉唧的分为三个TextView来实现,今天在微信中无意中看了一篇公众号文章,发现原来只要一个TextView就可以搞定啦,人生最悲哀的事情莫过于工作了这么久啦 ...

随机推荐

  1. Ubuntu 下查看中文man手册方法

    转载自:http://blog.chinaunix.net/uid-24830506-id-3266493.html Ubuntu 中文man手册安装方法 分类: LINUX Ubuntu 下查看中文 ...

  2. 六步破解win2008R2登录密码

    防火墙没有开启,win2008R被当成矿机,只好重新破解密码进去解决问题,试了好多方法,下列方法绝对实用简单. 破解2008登录密码的方法: 1.进入PE2.找到文件:windows\system32 ...

  3. hbase 部署

    hbase的部署相对于java来说就比较简单啦,主要过程如下: 1.下载hbase最新的稳定版 2.拷贝到相应的目录 3.修改conf目录下的hbase-env.sh,设置java 和不适用内置的zo ...

  4. SQL SERVER 2005快捷键

    一.SQL SERVER 2005快捷键 快捷键 功能 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL + SHIFT + O打开项目 ...

  5. 让IE6支持min-height,max-height等的方法

    1.IE6支持max-height解决方法    IE6支持最大高度解决CSS代码:.yangshi{max-height:1000px;_height:expression((document.do ...

  6. appium的inspectot使用

    前提已安装好appium环境 1. 打开appium-doctor 2. 启动appium-service,点击  inspector 3. 配置手机参数,参数获取参考上篇博客 4. 点击start ...

  7. C# 属性事件一些设置说明

    大致列举一些常用的属性或事件的一些修饰 用法类似,主要是对属性的进一步设置 [Browsable(true)] public bool Enable {get;set;} 顺便说一下事件的应用: pu ...

  8. ffmpeg 源码分析

    http://blog.csdn.net/liuhongxiangm/article/details/8824761 https://code.google.com/p/ffmpegsource/is ...

  9. VMWare -- 工作模式

    VMWare提供三种工作模式桥接(bridge).NAT(网络地址转换)和host-only(主机模式). 桥接模式 在桥接模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机(主机和 ...

  10. 【Java面试题】45 什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。

    我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象 ...