当前位置:   article > 正文

iOS 中webView的使用_ios app中的webview走app内设置的代理

ios app中的webview走app内设置的代理

一、初始化与三种加载方式

 UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种:
  • 1

第一种:
- (void)loadRequest:(NSURLRequest *)request;

这是加载网页最常用的一种方式,通过一个网页URL来进行加载,这个URL可以是远程的也可以是本地的,例如我加载百度的主页:

UIWebView * view = [[UIWebView alloc]initWithFrame:self.view.frame];
[view loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
[self.view addSubview:view];
  • 1
  • 2
  • 3

第二种:
- (void)loadHTMLString:(NSString )string baseURL:(NSURL )baseURL;
这个方法需要将httml文件读取为字符串,其中baseURL是我们自己设置的一个路径,用于寻找html文件中引用的图片等素材。

第三种:
- (void)loadData:(NSData )data MIMEType:(NSString )MIMEType textEncodingName:(NSString )textEncodingName baseURL:(NSURL )baseURL;
这个方式使用的比较少,但也更加自由,其中data是文件数据,MIMEType是文件类型,textEncodingName是编码类型,baseURL是素材资源路径。

二、一些常用的属性和变量
@property (nonatomic, assign) id delegate;
设置webView的代理

@property (nonatomic, readonly, retain) UIScrollView *scrollView;
内置的scrollView

@property (nonatomic, readonly, retain) NSURLRequest *request;
URL请求

  • (void)reload;
    重新加载数据

  • (void)stopLoading;
    停止加载数据

  • (void)goBack;
    返回上一级

  • (void)goForward;
    跳转下一级

@property (nonatomic, readonly, getter=canGoBack) BOOL canGoBack;
获取能否返回上一级

@property (nonatomic, readonly, getter=canGoForward) BOOL canGoForward;
获取能否跳转下一级

@property (nonatomic, readonly, getter=isLoading) BOOL loading;
获取是否正在加载数据

  • (NSString )stringByEvaluatingJavaScriptFromString:(NSString )script;
    通过javaScript操作web数据

@property (nonatomic) BOOL scalesPageToFit;
设置是否缩放到适合屏幕大小

@property (nonatomic) UIDataDetectorTypes dataDetectorTypes NS_AVAILABLE_IOS(3_0);
设置某些数据变为链接形式,这个枚举可以设置如电话号,地址,邮箱等转化为链接

@property (nonatomic) BOOL allowsInlineMediaPlayback NS_AVAILABLE_IOS(4_0);
设置是否使用内联播放器播放视频

@property (nonatomic) BOOL mediaPlaybackRequiresUserAction NS_AVAILABLE_IOS(4_0);
设置视频是否自动播放

@property (nonatomic) BOOL mediaPlaybackAllowsAirPlay NS_AVAILABLE_IOS(5_0);
设置音频播放是否支持ari play功能

@property (nonatomic) BOOL suppressesIncrementalRendering NS_AVAILABLE_IOS(6_0);
设置是否将数据加载如内存后渲染界面

@property (nonatomic) BOOL keyboardDisplayRequiresUserAction NS_AVAILABLE_IOS(6_0);
设置用户交互模式

三、iOS7中的一些新特性
下面这些属性是iOS7之后才有的,通过他们可以设置更加有趣的web体验
@property (nonatomic) UIWebPaginationMode paginationMode NS_AVAILABLE_IOS(7_0);
这个属性用来设置一种模式,当网页的大小超出view时,将网页以翻页的效果展示,枚举如下:

typedef NS_ENUM(NSInteger, UIWebPaginationMode) {
UIWebPaginationModeUnpaginated,//不使用翻页效果
UIWebPaginationModeLeftToRight,//将网页超出部分分页,从左向右进行翻页
UIWebPaginationModeTopToBottom,//将网页超出部分分页,从上向下进行翻页
UIWebPaginationModeBottomToTop,//将网页超出部分分页,从下向上进行翻页
UIWebPaginationModeRightToLeft//将网页超出部分分页,从右向左进行翻页
};

@property (nonatomic) CGFloat pageLength NS_AVAILABLE_IOS(7_0);
设置每一页的长度

@property (nonatomic) CGFloat gapBetweenPages NS_AVAILABLE_IOS(7_0);
设置每一页的间距

@property (nonatomic, readonly) NSUInteger pageCount NS_AVAILABLE_IOS(7_0);
获取分页数

四、webView协议中的方法

- (BOOL)webView:(UIWebView )webView shouldStartLoadWithRequest:(NSURLRequest )request navigationType:(UIWebViewNavigationType)navigationType;

准备加载内容时调用的方法,通过返回值来进行是否加载的设置。web视图指示加载内容时通知。应该返回YES开始加载。导航提供的类型参数,是指请求的来源,可以是下列任何一个:
//UIWebViewNavigationTypeLinkClicked 用户触击了一个链接
//UIWebViewNavigationTypeFormSubmitted 用户提交了一个表单
//UIWebViewNavigationTypeBackForward 用户触击前进或返回按钮
//UIWebViewNavigationTypeReload 用户触击重新加载的按钮
//UIWebViewNavigationTypeFormResubmitted 用户重复提交表单
//UIWebViewNavigationTypeOther 发生其它行为

- (void)webViewDidStartLoad:(UIWebView *)webView;

开始加载时调用的方法

- (void)webViewDidFinishLoad:(UIWebView *)webView;

结束加载时调用的方法

- (void)webView:(UIWebView )webView didFailLoadWithError:(NSError )error;

加载失败时调用的方法

五。补充
1.调用html中的js事件
js = [webView valueForKeyPath:@”documentView.webView.mainFrame.javaScriptContext”];
js[@”closewin”] = ^{
NSLog(@”closewin”);
dispatch_async(dispatch_get_main_queue(), ^{
[self.navigationController popToRootViewControllerAnimated:YES];
});
};
2.webView.request.URL.absoluteString 将请求地址转换为字符串
再次补充:

前两天帮朋友处理个全web的应用(我本人是震惊的),有的地方劳保让调原生,于是乎又”温习了”一遍web,各种地方先整理出来,如果大家看有不合适的地方请留言,必回复.
1.

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
  • 1

这个代理的方法是很常用的 一般在这里面.
navigationType 是一个UIWebViewNavigationType类型的枚举
UIWebViewNavigationTypeLinkClicked,
UIWebViewNavigationTypeFormSubmitted,
UIWebViewNavigationTypeBackForward,
UIWebViewNavigationTypeReload,
UIWebViewNavigationTypeFormResubmitted,
UIWebViewNavigationTypeOther
可以通过判断当前webview的请求是什么方式的来完成我们的需求.
request 参数是NSURLRequest类型,它的URL属性可以让我们准确的获取到网址,request.URL.absoluteString,转化为字符串.
return NO;//不加载网页
return YES;//加载网页

2.
webView的另一个重点是跟js的交互,这样可以让我们得到js中调用的方法和传递的参数.
首先创建个JSContext的对象.JSContext *context ;

    JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
  • 1

最简单的调用js中的方法就是

    context[@"jsFunction"] = ^{
    NSLog("在这个大括号中写我们想要实现的东西,当web中调用JSFunction这个方法的时候")
}
  • 1
  • 2
  • 3

如果说wb中的js方法是有参数的那我们也可以获取他传递的参数

context[@"nativeFunction"] = ^{
        NSArray *thisArr = [JSContext currentArguments];
        //获取到传递的参数的数组.例如html中传递了两个参数那么这个地方thisArr这个数组就包含两个值.其中存储的对象的类型是JSValue.
        JSValue *jsValue  = thisArr[0];
        NSLog(@"==%@",jsValue.toString);
        //JSValue 类型的对象其内部给我提供了转化的方法.点进去就能看到(点一下就够了),还有JSContext类型的属性,打印了看下不懂..
        //- (id)toObject;
    //- (id)toObjectOfClass:(Class)expectedClass;
    //- (BOOL)toBool;
    //- (double)toDouble;
    //- (int32_t)toInt32;
    //- (uint32_t)toUInt32;
    //- (NSNumber *)toNumber;
    //- (NSString *)toString;
    //- (NSDate *)toDate;
    //- (NSArray *)toArray;
    //- (NSDictionary *)toDictionary;

        NSString *payType = jsValue.toString;
        //这样就完美的知道了我web页面传递的参数了.这个地方就可以将参数截取过来自己爱干哈干哈了.
    };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

3.还要一种就是往web中注入js代码 这个百度很多的就不说了,我个人觉得iOS 开发还是了解下js比较好.这样在这个地方自己也能很方便的写注入js代码.
stringByEvaluatingJavaScriptFromString 通过web的这个方法实现.
解析oc调用js的方法
知道的这么一种方法如下:
[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@”showTitleMessage(‘%@’)”,@”oc调用了js的内容”]];
这里面%@左右的” 不能省略.

5.查找元素并隐藏
[webView stringByEvaluatingJavaScriptFromString:@”document.documentElement.getElementsByClassName(‘名称’)[0].style.display = ‘none’”];

6.获取js方法中的参数
NSArray *args = [JSContext currentArguments];
7.执行方法获得值
self.context[@”swiperMove”]=^{
NSString *str1 = [webView stringByEvaluatingJavaScriptFromString:@”$(‘.swiper-slide-active.content’).index();”];
NSLog(@”JS返回值:%@”,str1);
};
这里写图片描述
这里面的value 值也可以在我们这获取。

   问题:如何能够直接调用scrollTo这个window的方法。。。
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/109492
推荐阅读
相关标签
  

闽ICP备14008679号