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. 基于jQuery点击圆形边框弹出图片信息

    分享一款基于jQuery点击圆形边框弹出图片信息.这是一款鼠标经过图片转换成圆形边框,点击可弹出文字信息.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div id=&q ...

  2. wp中的位图

    // // 摘要: // 使用提供的元素和变换初始化 System.Windows.Media.Imaging.WriteableBitmap 类的新实例. // // 参数: // element: ...

  3. C语言 · 陶陶摘苹果

    算法提高 陶陶摘苹果   时间限制:1.0s   内存限制:256.0MB      问题描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出n个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个3 ...

  4. 载波帧听Carrier Sense

    在发送数据之前,以太网会“帧听”线缆,判断是否有其他数据传输. 如果通信介质上无载波,即没有被占用,则可以利用通信介质进行传送. 网卡芯片PHY具有上述功能. 数据链路层相关技术 共享介质网络 从通信 ...

  5. Zookeeper配置文件参数与含义

    zoo.cfg   # The number of milliseconds of each tick tickTime=2000 # The number of ticks that the ini ...

  6. Hibernate- 开发环境准备

    数据库:两张表,两者通过publisher_id构成关联关系. Book(图书表) CREATE TABLE `t_book` ( `id` int(11) NOT NULL AUTO_INCREME ...

  7. Geometric deep learning on graphs and manifolds using mixture model CNNs

    Monti, Federico, et al. "Geometric deep learning on graphs and manifolds using mixture model CN ...

  8. 【C#】获取电脑DPI

    public static class DPIGeter { /// <summary> /// 获取DPI /// </summary> /// <param name ...

  9. linux -- 注销,关机,重启

      注销:logout Logout 注销是登陆的相对操作,登陆系统后,若要离开系统,用户只要直接下达logout命令即可: [root@localhost root]#logout Red Hat ...

  10. Configurations of Vim/GVim of dsp

    Linux环境写到用户主目录下的.vimrc文件(没有则新建),Windows环境则为GVim安装目录下的_vimrc(没有则新建),内容如下: "分上下两屏 "sp " ...