/*
《Object-OC 里面调用JS 和 接入是遇到的问题的解决》
*/
/*
随着现代App的开发,轻量级的页面逐渐也都出现在App里面。但是有些其他特出功能的界面要使用的化。如果把js 放到服务器上,再给出一个代码去调用。那将花费很多时间。大多处理是将js文件放到本地。进行加载。。。。
*/
效果图:
// Created by 周双建 on 15/12/18.
// Copyright © 2015年 周双建. All rights reserved.
#import "ViewController.h"
@interface ViewController ()<UIWebViewDelegate>
typedef enum {
WebLoad_Q = 1,
WebLoad_W = 2,
WebLoad_E = 3
}WebLoad;
//首先创建一个展示js功能的控制器
@property(nonatomic,strong) UIWebView * JS_WebView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 我们做一些准备,将你的js 文件导入到工程里面 注意:这里会残生很多问题,下面再说
// 我们初始化 JS_WebView
[self makeWeb];
// Do any additional setup after loading the view, typically from a nib.
}
#pragma mark 初始化
-(void)makeWeb{
_JS_WebView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 80, self.view.bounds.size.width, self.view.frame.size.width *448/1072.0)];
//设置其代理 添加代理协议
_JS_WebView.delegate = self;
//设置web 适合给定尺寸的大小
//_JS_WebView.scalesPageToFit = YES;
//给其加载js 方式
[self webLoad:WebLoad_W];
//将Web添加到控制器上
[self.view addSubview:_JS_WebView];
}
#pragma mark Web 是用哪种方式加载 HTML的
-(void)webLoad:(int)type {
switch (type) {
case 1:
{
// 先声明一个 NSURLRequest
NSURLRequest * Request = [NSURLRequest requestWithURL:[NSURL URLWithString:[self HTMLpath]]];
// web 进行加载HTML
[_JS_WebView loadRequest:Request];
}
break;
case 2:
{
// 声明一个 NsData 类型 将HTML 转化为二进制流,在用Web加载
NSData * data = [NSData dataWithContentsOfFile:[self HTMLpath]];
// web 进行加载
[_JS_WebView loadData:data MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
}
break;
case 3:
{
//将HTML文件转化为字符串
NSString * str = [[NSString alloc]initWithContentsOfFile:[self HTMLpath] encoding:NSUTF8StringEncoding error:nil];
// 使用Web 进行加载
[_JS_WebView loadHTMLString:str baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
}
break;
default:
break;
}
}
#pragma mark 实现 web 的代理协议方法
//web 加载完成时调用的方法
-(void)webViewDidFinishLoad:(UIWebView *)webView{
//调用js 的函数
NSString * JS = [NSString stringWithFormat:@"loadDetail(\"%d\")",70];
[webView stringByEvaluatingJavaScriptFromString:JS];
//可以运行了。一运行。马丹没效果。只是显示了一个 0% .下面分析原因
/*
导致没有加载成功的原因有:
第一种: 在获取HTML文件的路径,错误,导致没有加载成功
第二种: 是你的JS 文件的错误。你可以在js里面自定义一个方法看是否运行
例如:
function getOver {
return "通过";
}
调用这个方法。检查是否调用。调用说明不是你的问题。否者,你就要检查 JS_Str 的写法。
第三种: 就是HTML 的文件路径不对(这个路径是HTML里面调用 CSS的路径不对)。
需要注意的是:
Xcode 是个好的开发工具。但是在加载 HTML的时候,就有点不好之处。那就是将你HTML的文件目录破坏,将其融合到一个目录下。这也是导致加载不成功的重要原因
第四种: 就是你在加载HTMl的时候,使用 这两个方法
- (void)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;
的时候,最后的 baseURL: 一定要给 URl 。否者会不显示图片类的加载
第六种: fileURLWithPath 和 URLWithPath 的使用区别(重点,指出)
*/
/*
上面已经列举出可能出现的错误的原因,其中第三种是常见的。下面就针对第三中给出解决方法。
解决一:
由于Xcode将HTML的文件目录破坏,那我们就将HTML里面的路径修改,例如:
/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta name="viewport"
content="height=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">
<title></title>
(1) <script src="src/plugins/jquery-1.11.3.min.js"></script>
(2) <script src="src/threesixty.js"></script>
(3) <link rel='stylesheet' href="src/styles/threesixty.css" type="text/css">
<script type="text/javascript">
/
上面需要修改的是 (1)(2)(3) 行。 将 src/plugins 和 src/styles 和 scr 去掉。
解决方法二:
将你的 JS 代码 打包为Bundle包。
*/
}
#pragma mark 获取js文件的路径
-(NSString*)HTMLpath{
NSString *resourcePath = [ [NSBundle mainBundle] resourcePath];
NSString *filePath = [resourcePath stringByAppendingPathComponent:@"test.html"];
return filePath;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end