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. MyEclipse9.0激活步骤

    MyEclipse 9.0的激活机制 1.破解公钥(确保MyEclipse没有开启,否则失败!)   解压破解包中的myeclipse9_keygen_activator.zip,复制publicKe ...

  2. Python内置字典;dict ,set

    dict and set dict:  键-值 /重复添加 set :  键 / key不能重复 对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容.相反,这些方法会创建新的对象并返 ...

  3. Java web 项目读取src或者tomcat下class文件夹下的xml文件或者properties文件

    //生成一个文件对象: File file = new File(getClass().getClassLoader().getResource("test.xml").getPa ...

  4. java中的访问控制符

    首先来一张图: 对于一个类而言访问控制符只有一个public和默认无修饰符.其他的几个访问修饰符对于变量和方法都可以使用. 下面介绍具体的使用. 1. 公有访问控制符(public) Java的类是通 ...

  5. [shell]shell脚本传入不固定参数的写法,如--help等

    最近在调试一个wifi模块,需要传一些不固定的参数,一下一个参数解析的函数可以搞定这个事情,里面内容好多部分是从一个example中剽窃而来(窃喜) #!/bin/bash # writen by a ...

  6. debian配置ftp

    大家好,最近几天我在配置vsftpd,总结出如何更快的配置vsftpd1.我的系统是debian 5.02.安装 vsftpd, apt-get install vsftpd3.配置 vsftpdcd ...

  7. javascript 复制与粘贴操作

    <script language="javascript"> function readTxt() { alert(window.clipboardData.getDa ...

  8. [Spring] Java spring quartz 定时任务

    首先,需要导入quartz 的jar包 ① applicationContext.xml <!-- 轮询任务 --> <import resource="classpath ...

  9. relation 关联模型

    关联关系必然有一个参照表,例如:有一个员工档案管理系统项目,这个项目要包括下面的一些数据表:基本信息表.员工档案表.部门表.项目组表.银行卡表(用来记录员工的银行卡资料).这些数据表之间存在一定的关联 ...

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

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