Lua addEventListener传字符串回调收到table类型参数问题排查
问题根因
Corona SDK的addEventListener接口不支持绑定事件时直接将自定义值作为第三参传入回调函数。你当前代码中skipButton:addEventListener("tap",gotoSkip, "StringExample")的写法不符合框架参数规则:tap事件触发时,框架给回调函数传入的第一个参数固定是事件对象table,你传入的第三个位置的字符串不会被框架当作回调入参传递,打印得到的table就是框架原生传入的tap事件对象,内部包含触发源对象、点击坐标、事件阶段等内置属性。
错误点说明
- 对
addEventListener的参数规则理解有误:该方法第三个可选参数是用来指定回调执行时的self上下文的table值,不是传给回调的自定义参数,你传入的字符串不会被框架识别为有效传参。 - 直接绑定全局函数作为交互事件回调时,回调的唯一默认入参固定是事件table,不会自动携带你预期的自定义字符串参数。
修复方案
方案1:闭包包装传参(最简便)
用匿名函数包装目标回调,通过闭包捕获要传入的自定义字符串,替换原有事件绑定代码即可:
-- 替换scene:create中原本的skipButton:addEventListener行 skipButton:addEventListener("tap", function() gotoSkip("StringExample") end)
方案2:自定义属性挂载传参
如果不想使用闭包,可以把要传递的场景字符串挂载到按钮对象的自定义属性上,回调中从事件对象里读取对应属性:
-- 给按钮挂载自定义场景名属性 skipButton.targetScene = "StringExample" -- 修改gotoSkip回调逻辑,从事件对象取参 function gotoSkip(event) local para = event.target.targetScene print(para) print(type(para)) -- 场景跳转逻辑 composer.gotoScene(para) return true -- 交互事件回调需return true阻止事件冒泡,避免穿透触发下层监听 end -- 事件绑定无需传第三参 skipButton:addEventListener("tap", gotoSkip)
注意:Corona SDK中所有tap、touch类UI事件回调,约定需要返回
true,告知框架当前事件已被处理,避免事件穿透到下层显示对象触发多余监听。
内容的提问来源于stack exchange,提问作者Nicholas O'Neal
相关产品推荐
相关产品推荐

