在oc与js交互过程中,oc怎么触发js里的点击事件

在oc与js交互过程中,oc怎么触发js里的点击事件,第1张

wkwebview

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11720744.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存