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. git工作流教程

    简介:在用git进行开发时,需要规范化,这时用git工作流来规范化,软件开发过程 https://github.com/oldratlee/translations/blob/master/git-w ...

  2. C语言 · 输出日历

    算法提高 输出日历   时间限制:1.0s   内存限制:512.0MB      按照下述格式打印2006年12月日历: Calendar 2006-12---------------------- ...

  3. Makefile 编译动态库文件及链接动态库

    本文为原创文章,转载请指明该文链接 文件目录结构如下 dynamiclibapp.c Makefile comm/inc/apue.h comm/errorhandle.c dynamiclib/Ma ...

  4. DHCP服务器-DNS服务器-Samba服务器

    DHCP服务器 DHCP在管理网络配置方面很有作用,特别是一个当一个网络的规模较大时,使用DHCP可极大的减少 管理员的工作量. DHCP分为两部分:服务端和客户端.服务端负责集中管理可动态分配的IP ...

  5. IE6、IE7、IE8、Firefox兼容性

    整理关于IE6.IE7.IE8.Firefox兼容性CSS HACK问题 1.区别IE和非IE浏览器CSS HACK代码 #divcss5{background:blue; /*非IE 背景藍色*/b ...

  6. 历届蓝桥杯C/C++省赛试题

    2012年第三届蓝桥杯C/C++程序设计本科B组省赛 2013年第四届蓝桥杯C/C++程序设计本科B组省赛 2014年第五届蓝桥杯C/C++程序设计本科B组省赛 2015年第六届蓝桥杯C/C++程序设 ...

  7. 让PHP7达到最高性能的几个Tips

    PHP7 已经发布了,作为PHP十年来最大的版本升级,最大的性能升级,PHP7在多放的测试中都表现出很明显的性能提升,然而,为了让它能发挥出最大的性能,我还是有几件事想提醒下. PHP7 VS PHP ...

  8. [android] AndroidManifest.xml 详解

    第1部分 标签库+包路径+版本控制 <manifest xmlns:android="http://schemas.android.com/apk/res/android" ...

  9. 多媒体开发之h264中的sps---sps信息提取之分辨率宽高提取2

    -------------------author:pkf -----------------------------time:2015-8-20 -------------------------- ...

  10. python不同package下相互调用

    路径如: /path/dir1/a.py /path/dir2/b.py 调用举例如: 在/path/dir2/b.py中调用 a模块 import sys sys.path.append(" ...