从 iOS 中的 UIViewController 类调用 JavaScript 函数

Posted

技术标签:

【中文标题】从 iOS 中的 UIViewController 类调用 JavaScript 函数【英文标题】:Call JavaScript function from UIViewController class in iOS 【发布时间】:2015-06-30 08:53:23 【问题描述】:

我想从我的视图控制器类之一调用 javascript 函数,

这是我尝试过的代码 sn-p,但它不起作用:(

代码在我的ViewController

- (NSString *)MyMehtod
    JSContext *context = [[JSContext alloc] init];
    JSValue *function = context[@"ProfilePicFunction"];
  [context evaluateScript: [self loadJsFromFile]]; //crashes here EXC_BAD_ACESS
     JSValue* result = [function callWithArguments:@[[documentsDirectory stringByAppendingString:@"/ProfilePic.png"]]];
    NSLog(@"result = %@",result);


- (NSString *)loadJsFromFile
    
        NSString *path = [[NSBundle mainBundle] pathForResource:@"app" ofType:@"js"]; //path returns here as nil
        NSString *jsScript = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; //jsScript returns here as nil
        return jsScript;
    

app.js 文件中的代码

function ProfilePicFunction(ProfilePicPath)
     var d= new Date();

    var userFullPath = ProfilePicPath+"?"+d.getTime();

    $("#userImg").attr("src",userFullPath);

app.js的位置 请提前帮助和感谢!!

【问题讨论】:

你检查过 js 目录在你的包里吗?从您的错误来看,这听起来不像。 也试过NSString *path = [[NSBundle mainBundle] pathForResource:@"app" ofType:@"js" inDirectory:@"js"];它现在返回路径而不是nil但是javascript函数没有被调用:( 为每一行代码添加一些调试NSLog语句并贴出来。否则很难知道出了什么问题。此外,app.js 是否依赖于其他 javascript。如果是这样,您必须先加载它需要的所有支持? 我觉得你可能是这里的跟踪方式。 app.js 正在运行 jquery 代码。您将需要一个 JSContext 到 UIWebView 或其他 JSVirtualMachine 上,其中加载的网页已拉入 jquery 以及您要操作的任何 DOM? 【参考方案1】:

我认为您应该更改代码的顺序:

1) 首先你必须评估脚本:

[context evaluateScript: [self loadJsFromFile]];

2) 然后从上下文中获取函数名

JSValue *function = context[@"ProfilePicFunction"];

【讨论】:

你不会得到结果,因为你没有从方法中返回任何东西,我认为这可能会有所帮助:hayageek.com/execute-javascript-in-ios ...你可以将方法的实现更改为 sum 操作并检查你的JS代码是否正确 谢谢你的代码3rd点对我有帮助(Access JavaScript functions and execute them in Objective-C)但我的问题是我的javascript函数位于app.js文件中:(如何访问该文件并执行该代码目标c?【参考方案2】:
- (NSString *)loadJsFromFile
     NSString* js = [[NSString alloc] initWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"app" ofType:@"js"]] encoding:NSUTF8StringEncoding];
     return js;

【讨论】:

以上是关于从 iOS 中的 UIViewController 类调用 JavaScript 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式从 iOS Swift 3 中的 XIB 推送和呈现给 UIViewController

如何从 Swift 中的 UITableViewRowAction 向 UIViewController 传递数据?

iOS:如何从 UIViewController 通知 appDelegate

iOS对UIViewController生命周期和属性方法的解析

iOS:从视图中查找 uiviewcontroller 的类名

从设置视图 iOS 返回时启动不同的 UIViewController