NSString *JS_Str = @“js代码”
[self.webView evaluateJavaScript:JS_Str completionHandler:nil]
UIWebview 和这类似
如果你拿不到JS代码 就自己获取到,然后自己找那句代码
OC 允许动态注册一个类(指定父类和类名),Runtime API还可以为这个动态创建的类添加方法、成员变量(需要在注册类之前添加)、属性、协议等等。动态创建类后,需要调用函数注册该类,这样才可以使用。
示例:
示例
示例:
示例:
示例:
其中 method_exchangeImplementations() 交换两个方法实现在iOS框架中应用的很广。比如:
UIButton 继承自 UIControl ,通过 addTarget-Selector 添加点击事件后,都会来到 sendAction:to:forEvent: 方法。所以可以通过方法交换的方式来达到 hook 的方式。
示例中,还有一个点,调用系统原有实现时,调用了 gl_sendAction:to:forEvent: 。字面上看造成了死循环其实不然,我们通过下面的图来解释。
方法没有交换前
@selector(sendAction:to:forEvent:) 可以找到 sendAction:to:forEvent: 的实现。
@selector(gl_sendAction:to:forEvent:) 可以找到 gl_sendAction:to:forEvent: 的实现。
实现交换后
所以系统内部调用 sendAction:to:forEvent: 时,会来到 gl_sendAction:to:forEvent: 的实现。当我们调用系统原有的实现就要调用 gl_sendAction:to:forEvent: 。
我们都知道数组是不可以添加 nil 的,否则会发生崩溃
crash信息:
从这我们可以看出, addobjectivecect: 方法最后调用了 insertObject:atIndex: 。NSMutableArray的类并不是我们看到的NSMutableArray,而是__NSArrayM 。这是因为 Foundation framewor k框架下广泛使用了 类簇 的设计模式。它管理了一组隐藏在公共抽象父类下的具体私有子类。
在Cocoa中,实际上许多类都是以类簇的方式实现的,即它们是一群隐藏在通用接口之下与实现相关的类。例如创建数组时可能是 __NSArray0 , __NSSingleObjectArray , __NSArrayI ,所以请不要轻易尝试创建 NSString , NSArray , NSDictionary 的子类。对类簇使用 isKindOfClass 和 isMemberOfClass 的结果可能是不正确的。因为类簇是由公共抽象类管理的一组私有类,公共抽象类并不是实例对应的真正的类,类簇中真正的类的从属关系被隐藏了。
所以要对 NSMutableArray *** 作,选择的类是 __NSArrayM
这里要对 insertObject:atIndex: 添加非空判断。
本例子是为了让大家能快速开发出OC调用JS功能的一个简单的例子。1、准备一个本地化的html网页,如jsIOS.html
<script type="text/javaScript">
function postStr(){
return document.getElementById("text1").value
//return "javaScript返回值啦"
}
</script>
2、将此html文件放到项目代码目录里面,如图:
3、拖一个UIWebView控件和UIButton控件到xxxViewController对应的.xib或.storyboard视图的UIView上;
在xxxViewController的.h文件中分别声明UIWebView类型变量和UIButton类型的变量,以及一个按钮点击事件(并且跟视图里面的控件连线),
并且添加一个UIWebViewDelegate类型的委托。<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+eHh4Vmlld0NvbnRyb2xsZXIuaM7EvP7E2sjdyOfPwqO6PC9wPgo8cD48L3A+CjxwIGNsYXNzPQ=="p1">
#import
@interface ViewController : UIViewController
@property(nonatomic,retain) IBOutlet UIWebView *webview
@property(nonatomic,retain) IBOutlet UIButton *button
-(IBAction)IOS_JS:(id)sender
@end
4、在xxxViewController.m文件中实现通过点击事件,调用javaScript的方法并取得返回值。
代码如下:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize webview
- (void)viewDidLoad
{
[super viewDidLoad]
//设置webView
webview.backgroundColor = [UIColor clearColor]
//webview.scalesPageToFit =YES
webview.delegate =self
//找到jsIOS.html文件的路径
NSString *basePath = [[NSBundle mainBundle]bundlePath]
NSString *helpHtmlPath = [basePath stringByAppendingPathComponent:@"jsIOS.html"]
NSURL *url = [NSURL fileURLWithPath:helpHtmlPath]
//加载本地html文件
[webview loadRequest:[NSURLRequest requestWithURL:url]]
}
/*
* 点击事件
* 调用javaScript的方法postStr()并取得返回值
* 输出返回值到控制台
*/
-(IBAction)IOS_JS:(id)sender
{
NSString *str = [self.webview stringByEvaluatingJavaScriptFromString:@"postStr()"]
NSLog(@"JS返回值:%@",str)
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning]
}
@end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)