在tvOS应用中从Swift调用JS函数时,“ TypeError:未定义不是对象”

guytz72

我在陷入困境的tvOS应用中从Swift调用JS函数时遇到错误。

我已经设置了可以从JS调用Swift的功能,但是可以正常工作,但是当尝试从Swift调用JS函数时,我在Safari调试器中收到以下错误:

TypeError: undefined is not an object
(anonymous function)
JSValueToObject
-[JSValue callWithArguments:]
_TFFC13tvOSShortGame11AppDelegate17callPlayVideoInJSFS0_FSST_U_FCSo9JSContextT_
_TTRXFo_oCSo9JSContext_dT__XFdCb_dS__dT__
-[IKAppContext _doEvaluate:]
-[IKAppContext _evaluate:]
__41-[IKAppContext evaluate:completionBlock:]_block_invoke
-[IKAppContext _sourcePerform]
IKRunLoopSourcePerformCallBack
__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
__CFRunLoopDoSources0
__CFRunLoopRun
CFRunLoopRunSpecific
CFRunLoopRun
-[IKAppContext _jsThreadMain]
__NSThread__start__
_pthread_body
_pthread_body
thread_start

相关的快速代码如下:

//From JS to Swift
//call this method once after setting up your appController.
func createGetVimeoURL(){

    //allows us to access the javascript context
    appController?.evaluateInJavaScriptContext({(evaluation: JSContext) -> Void in

        //this is the block that will be called when javascript calls getVimeoURL(str)
        let getVimeoURL : @convention(block) (String) -> Void = {
            (videoName : String) -> Void in

            //5. return the vimeo url to the JS code for the passed in videoName
            self.getTempVimeoURL(videoName)
        }

        //this creates a function in the javascript context called "getVimeoURL".
        //calling getVimeoURL(str) in javascript will call the block we created above.
        evaluation.setObject(unsafeBitCast(getVimeoURL, AnyObject.self), forKeyedSubscript: "getVimeoURL")
        }, completion: {(Bool) -> Void in
            //evaluation block finished running

    })
}
//From Swift to JS
//when callPlayVideoInJS() is called, playVideo(url) will be called in JavaScript.
func callPlayVideoInJS(url : String){

    //allows us to access the javascript context
    appController!.evaluateInJavaScriptContext({(evaluation: JSContext) -> Void in

        //get a handle on the "playVideo" method that you've implemented in JavaScript
        let playVideo = evaluation.objectForKeyedSubscript("playVideo")

        //Call your JavaScript method with an array of arguments
        playVideo.callWithArguments([url])

        }, completion: {(Bool) -> Void in
            //evaluation block finished running
    })
}

//4. getTempVimeoURL from videoName
func getTempVimeoURL (videoName : String) -> String {
        return  "http://techslides.com/demos/sample-videos/small.mp4"      
}

以及应该由swift(我手动创建)调用的javascript函数:

playVideo: function (url) {
  if(url) {
    //2
    var player = new Player();
    var playlist = new Playlist();
    var mediaItem = new MediaItem("video", url);

    player.playlist = playlist;
    player.playlist.push(mediaItem);
    player.present();
  }
}

当我在appController didFinishLaunchingWithOptions中调用createGetVimeoURL时,会创建getVimeoURL javascript函数。

但是我无法弄清楚为什么我在调用callPlayVideoInJS时收到javascript错误,但这可能很简单!

任何帮助表示赞赏。

郡友关系

看来您没有使用objectForKeyedSubscript访问适当的JS方法

改变

let playVideo = evaluation.objectForKeyedSubscript("vimeoVideoURL")

let playVideo = evaluation.objectForKeyedSubscript("playVideo")

[更新]您还需要确保可以从适当的上下文和范围访问playVideo方法。尝试将playVideo方法放入application.js中

var playVideo = function (url) {
...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

尝试从对象调用get()或set()时得到“未捕获的TypeError:未定义不是函数”

来自分类Dev

ngRoute TypeError:未定义不是函数

来自分类Dev

TypeError:未定义不是构造函数

来自分类Dev

TypeError:未定义不是函数-AngularJS

来自分类Dev

ngRoute TypeError:未定义不是函数

来自分类Dev

TypeError:未定义不是函数(AngularJS)

来自分类Dev

在对象中调用方法时,Javascript中出现“未捕获的TypeError:未定义不是函数”的错误消息

来自分类Dev

实例化函数中的对象会导致“未捕获的TypeError:未定义不是函数”

来自分类Dev

TypeError:未定义不是节点js中的函数

来自分类Dev

例外:TypeError:未定义不是Ionic 2中的对象(评估“ pipe.constructor”)吗?

来自分类Dev

TypeError:未定义不是函数-Sails.js

来自分类Dev

Node.js TypeError:未定义不是函数

来自分类Dev

password.js TypeError:未定义不是函数

来自分类Dev

TypeError:未定义不是Angular Resource中的函数

来自分类Dev

未定义的typeerror未定义不是javascript中的函数

来自分类Dev

未定义不是构造函数()方法中的对象

来自分类Dev

未捕获的TypeError未定义不是函数匿名函数

来自分类Dev

通过函数编程获取“ TypeError:未定义不是函数”

来自分类Dev

未捕获的TypeError未定义不是函数匿名函数

来自分类Dev

TypeError:“未定义”不是函数(计算“ sinon.spy()”)

来自分类Dev

未捕获的TypeError:未定义不是indexOf上的函数

来自分类Dev

$ resource.get给出“ TypeError:未定义不是函数”

来自分类Dev

Bootstrap .dropdown()“未捕获的TypeError:未定义不是函数”

来自分类Dev

jQuery droppable的“未捕获的TypeError:未定义不是函数”

来自分类Dev

TypeError:未定义不是函数-Angular Animate

来自分类Dev

jQuery datepicker()未捕获的TypeError:未定义不是函数

来自分类Dev

angularjs TypeError:未定义不是函数工厂

来自分类Dev

未捕获的TypeError:未定义不是函数-checkValidity

来自分类Dev

$ compile显示未捕获的TypeError:未定义不是函数

Related 相关文章

  1. 1

    尝试从对象调用get()或set()时得到“未捕获的TypeError:未定义不是函数”

  2. 2

    ngRoute TypeError:未定义不是函数

  3. 3

    TypeError:未定义不是构造函数

  4. 4

    TypeError:未定义不是函数-AngularJS

  5. 5

    ngRoute TypeError:未定义不是函数

  6. 6

    TypeError:未定义不是函数(AngularJS)

  7. 7

    在对象中调用方法时,Javascript中出现“未捕获的TypeError:未定义不是函数”的错误消息

  8. 8

    实例化函数中的对象会导致“未捕获的TypeError:未定义不是函数”

  9. 9

    TypeError:未定义不是节点js中的函数

  10. 10

    例外:TypeError:未定义不是Ionic 2中的对象(评估“ pipe.constructor”)吗?

  11. 11

    TypeError:未定义不是函数-Sails.js

  12. 12

    Node.js TypeError:未定义不是函数

  13. 13

    password.js TypeError:未定义不是函数

  14. 14

    TypeError:未定义不是Angular Resource中的函数

  15. 15

    未定义的typeerror未定义不是javascript中的函数

  16. 16

    未定义不是构造函数()方法中的对象

  17. 17

    未捕获的TypeError未定义不是函数匿名函数

  18. 18

    通过函数编程获取“ TypeError:未定义不是函数”

  19. 19

    未捕获的TypeError未定义不是函数匿名函数

  20. 20

    TypeError:“未定义”不是函数(计算“ sinon.spy()”)

  21. 21

    未捕获的TypeError:未定义不是indexOf上的函数

  22. 22

    $ resource.get给出“ TypeError:未定义不是函数”

  23. 23

    Bootstrap .dropdown()“未捕获的TypeError:未定义不是函数”

  24. 24

    jQuery droppable的“未捕获的TypeError:未定义不是函数”

  25. 25

    TypeError:未定义不是函数-Angular Animate

  26. 26

    jQuery datepicker()未捕获的TypeError:未定义不是函数

  27. 27

    angularjs TypeError:未定义不是函数工厂

  28. 28

    未捕获的TypeError:未定义不是函数-checkValidity

  29. 29

    $ compile显示未捕获的TypeError:未定义不是函数

热门标签

归档