两个手指头同时点击,网页页面返回上一页,在uiwebview 手势返回里怎么实现

【iOS开发】UIWebView与JavaScript(JS)&回调交互
-------------------------------------------------
很多关于objc 与 js 交互的文章都比较适用于 mac开发,iOS的webview 还是有所不一样,
本文提供了一个很好解决UIWebView内js和objc
交互的思路。
自然,从oc到js,可以使用
stringByEvaluatingJavaScriptFromString: 来实现。
从js到oc,采用比较巧妙的设计,UIWebView浏览器拦截
url请求,自定义url的方式拦截交互请。
-------------------------------------------------
-------------------------------------------------
UIWebView是IOS
SDK中渲染网面的控件,在显示网页的时候,我们可以hack网页然后显示想显示的内容。其中就要用到javascript的知识,而UIWebView与javascript交互的方法就是stringByEvaluatingJavaScriptFromString:
有了这个方法我们可以通过objc调用javascript,可以注入javascript。
首先我们来看一下,如何调用javascript:
这儿myFunction()就是我们的javascript方法。
再来看看入何注入javascript,我们先写一个需要注入的javascript:
保存为test.js,然后拖到xcode
的resource分组下。再用代码在初始化的时候注入这个js(如在viewDidLoad方法里)。
这样就注入了上面的js,那么我们可以随时调用js的方法,如何调用,上面有介绍。
那么我们能不能通过js来调用objc的方法呢。
当然可以,原理就是利用UIWebView重定向请求,传一些命令到我们的UIWebView,在UIWebView的delegate的方法中接收这些命令,并根据命令执行相应的objc方法。这样就相当于在javascript中调用objc的方法。说起来有点抽象,看看代码一下就明白。
首先我们写一个javascript 方法如下:
[javascript]&
然后在你的html里调用这个js方法
[javascript]&
最后我们在UIWebVew中截获这个重定向请求:
&不过有一个开源工程大家可以看看,它允许javascript调用objective_c的方法。叫
&/p/jsbridge-to-cocoa/
还有两个相关工程
&与&&值得大家慢慢研究。
插入js代码
上面的功能我们可以封装到一个js函数中,将这个函数插入到页面上执行,代码如下:
([title compare: @"Google"]==NSOrderedSame )
[webView stringByEvaluatingJavaScriptFromString:@"var script =
document_createElement_x_x('script');"&
"script.type = 'text/javascript';"&
"script.text = "function myFunction() { "&
"var field =
document.getElementsByName('q')[0];"&
"field.value='朱祁林';"&
"document.forms[0].submit();"&
"document.getElementsByTagName_r('head')[0].a(script);"];&
stringByEvaluatingJavaScriptFromString:@"myFunction();"];&
看上面的代码:
a、首先通过js创建一个script的标签,type为'text/javascript'。
b、然后在这个标签中插入一段字符串,这段字符串就是一个函数:myFunction,这个函数实现google自动搜索关键字的功能。
c、然后使用stringByEvaluatingJavaScriptFromString执行myFunction函数。
1.&一般调用
将本地数据,封装,直接作为JS的返回值。如:获取软件的APPCode
//获取APPCode
*_plist_paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
*_plist_paths_path=[_plist_paths&objectAtIndex:0];
&NSArray *_plist_array= [_plist_paths_path
componentsSeparatedByString:@"/"];
&NSString *_appcode=[[NSString alloc]init];
&for (NSString *item in _plist_array) {
&&if ([item length]==36) {
&&&_appcode=
&NSLog(@"current appcode:%@",_appcode);
//注入到js中
&NSMutableString *_getApkCode=[[NSMutableString
alloc]init];
&[_getApkCode appendFormat:@"
function& _getApkCode(){"];
&[_getApkCode
appendFormat:@"return&];
&[_getApkCode appendString:@" }"];
&[self.webView
stringByEvaluatingJavaScriptFromString:_getApkCode];
&[_getApkCode release];
2.需要跟平台进行交互调用
1.制造含有一定含义的请求如:(location.href="download");
2.在方法:-(BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType中,拦截:
//testMall:http://192.168.1.20:8083本地测试页面地址
*pre_download=[NSString stringWithFormat:@"];
&if([url hasPrefix:pre_download])
//下载代码。。。。
3. 注意事项
a.存在Iframe嵌套的页面,js注入
页面注入JS是注入到,浏览器的html中,对于内部嵌套iframe框架的页面,则无法调用到js。此时相当于调用父页面的JS。
可以通过parent+方法名,来调用你注入的JS。parent.parent的使用个数,可以是多个,不影响js的执行,如果少用parent,可能会导致,调不到你注入的JS
b.存在交互的处理方法。推荐使用方法,iphone只负责提供js接口,不调用html内部或其他的js接口
addDownload()
url='www.XXX.XXX.zip';
download(url);//调用iphone提供的js接口
addDownloadTask_ret();//获取iphone下载接口执行的下载结果,此处调的是本地的一个延迟方法
//获取iphone下载接口执行的下载结果
addDownloadTask_ret()
obj=getDownloadTaskResult();//此处为iphone提供的接口,负责返回当前下载执行情况的结果if(''!=obj||undefined!=obj)
//调用本地的一些后续处理方法。
setTimeout("addDownloadTask_ret2();",1000);
-------------------------------------------------
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。UIWebView里,手指左右滑动,能够翻页
UITableView点击row进入详细视图,详细视图是UIWebView做的,显示信息。
希望能够在UIWebView里,手指左右滑动,能够翻页,查看下一条信息。
再加上 UIGestureRecognizerDelegate委托
UISwipeGestureRecognizer&*swipeLeft =
[[UISwipeGestureRecognizer&alloc]
initWithTarget:self action:@selector(swipeLeft)];
swipeLeft.direction&=
UISwipeGestureRecognizerDirectionL
swipeLeft.delegate =
[WebView addGestureRecognizer:swipeLeft];
[swipeLeft release];
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。swift之第一个IOS程序(浏览web页面) - iPhone手机开发技术文章 - 红黑联盟
swift之第一个IOS程序(浏览web页面)
1、工程的建立
a、选择第二个(Greate a new Xcode project)
b、左边选择中的Application,右边Singl View Application,最后next
c、在Product Name输入程序名,比如fistIOS
d、选择程序存储位置
2、开始编码
a、文件说明 AppDelegate.swift 文件是IOS工程响应整个APP的文件,AppDelegate用于监听整个APP的事件(具体看最后面代码); ViewController.swift 主要用于编写控制视图的代码; Main.storyboard 故事板,将UI可视化工具成为故事板;
b、选择Main.storyboard,在中间视图,点击wAny hAny选择如下图所示相应大小,然后双击即可
c、在右下角可以看到控件的添加(直接拖过去即可),分别添加Button和WebView控件
d、右上角如下图所示,点击第二个圈圈那个图标,就可以看到第e步,视图右边会有代码
e、UI与视图控件关联 右键单击Button控件,会弹出如下菜单
找到Touch Down菜单项,在菜单项右侧有一个加号按钮,用鼠标选中拖动到代码区域,然后就给Button起一个名字,最后点击connect即可
同样右键单击WebView控件,找到New Referecing Outlet菜单项,同样的方法拖到代码空白区域,并给控件命名webview,就可看到下图所示
f、ViewController.swift,在函数button中添加代码
3、运行代码
(注意,可能模拟器太大,当看到白屏的时候,就往上拉一下,就可以看到一下内容)
点击&浏览网页按键&就可看到网页中相应内容
各个文件的代码注释说明:
实现一个可以浏览web页面的程序
1、AppDelegate.swift(应用程序代理,监听整个APP的事件)
AppDelegate.swift
Created by Emperor on 15/3/5.
Copyright (c) 2015年 Emperor. All rights reserved.
import UIKit
//AppDelegate用于监听整个APP的事件,比如当APP启动完成后,会调用application方法
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
//APP启动完成后调用
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -& Bool {
return true
func applicationWillResignActive(application: UIApplication) {
//APP进入后台时调用
func applicationDidEnterBackground(application: UIApplication) {
//APP进入前台时调用
func applicationWillEnterForeground(application: UIApplication) {
func applicationDidBecomeActive(application: UIApplication) {
//APP终止时调用
func applicationWillTerminate(application: UIApplication) {
2、Main.storyboard (故事板)
将UI可视化工具成为故事板(storyboard);
在这里添加一个Button和WebView控件
3、ViewController.swift(视图控制器)
ViewController.swift
Created by Emperor on 15/3/5.
Copyright (c) 2015年 Emperor. All rights reserved.
//功能:实现一个可以浏览web页面的程序
//主要用于编写控制视图代码。在该文件中实现了一个ViewController类,该类是UIViewController的子类,用于控制视图上得UI,在该类中默认生成了两个事件方法
import UIKit
class ViewController: UIViewController {
/*默认情况下,Main.storyboard和ViewController.swift关联了,所以可以将控件UI的代码写在
ViewController.swift文件中。在ViewController.swift中在比如web控件上右键,就会弹出一个菜单,找到&New Referecing Outlet&项,其右侧有一个加号,用鼠标拖到ViewController代码区域空白处即可(在xcode最右侧可以看到6个图标,选择第二个就可以在视图中看到视图相关联的代码); 按键控件的话就是选择Touch Down选项*/
//添加的webview变量,这个变量就是可以直接访问WebView控件(自己添加在Main.storyboard故事面板的)
@IBOutlet weak var webview: UIWebView!
//按键,按下按键后要做的事就在这里
@IBAction func onTouchDown(sender: AnyObject) {
var url = NSURL(string: http://blog.csdn.net/emperorzhi/article/details/);
var request = NSURLRequest(URL: url!);
webview.loadRequest(request);
//当视图装载时调用
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//当内存不足时调用
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.22288人阅读
iOS(437)
的网址&http://blog.csdn.net/zhaoweixing1989/article/details/
在网上看到很多文章都说iOS的UIWebView比较耗内存,在我的项目中,最开始我也是用UIWebView来加载网页的。刚开始加载的是自己拼接成的Html,后来在Html中加入一个按钮,点击之后用当前的UIWebView去加载网络上的网页。程序跑起来发现非常耗内存,加载几个网上的网页之后就爆内存警告了,不处理的话很容易被评估拒掉app。后来就改成用系统的safari浏览器来打开网络上的网页,把着耗内存的工作交给苹果自己自带的浏览器来处理,就避免了我这个app
crash。但是怎么获取网页上这个按钮点击的事件呢,这个按钮本身就绑定了一个url,怎么让它点击之后当前的UIWebView不去load这个url呢。
后来查了一下资料,发现UIWebView的协议里面有这么个方法,可以获取它加载的网页上面的事件,比如单击了图片,单击了按钮等等。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
//判断是否是单击
& & if (navigationType == UIWebViewNavigationTypeLinkClicked)
& & & & NSURL *url = [request URL];
& & & & if([[UIApplication sharedApplication]canOpenURL:url])
& & & & & & [[UIApplication sharedApplication]openURL:url];
& & & & return NO;
& & return YES;
拼接的Html最后加的按钮的方法如下:
NSURL * path = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@&source_page_button& ofType:@&png&]];
& & [strReturn appendString:[NSString stringWithFormat:@&&div style='display:text-align:margin:0'&&a href='%@'&&img src='%@'&&/a&&/div&&,_url,path]];
这样写了之后,点击按钮之后就不会用当前的UIWebView来加载网络上的网页,而是调用系统的Safari来打开。
注意:最后一点要返回YES,否则UIWebView刚开始将一片空白,这是因为第一次加载的时候也是UIWebView请求一个链接,如果返回NO,就不会去加载了。还可以对url的内容进行判断,看是什么请求。
接口,如果为webView添加了delegate对象并实现该接口,那么在webView加载任何一个frame之前都会delegate对象的该方法,该方法的返回值用以控制是否允许加载目标链接页面的内容,返回YES将直接加载内容,NO则反之。并且UIWebViewNavigationType枚举,定义了页面中用户行为的分类,包括
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:689445次
积分:8023
积分:8023
排名:第1292名
原创:128篇
转载:476篇
评论:27条
(5)(1)(3)(6)(4)(16)(7)(13)(5)(15)(38)(17)(3)(2)(13)(15)(3)(2)(17)(40)(8)(29)(13)(2)(6)(5)(31)(124)(63)(98)

我要回帖

更多关于 uiwebview点击事件 的文章

 

随机推荐