在使用 Cocos2d-lua + ccs 进行开发的时候,获取ccs拼接的ui界面中的子节点的方法为 getChildByName(),例如:
parent:getChildByName("childName")
但是这个方法只能逐层获取,比如下面这个节点层级:
node_main
node_top
img_bg_top
node_center
img_bg_center
txt_desc
现在需要修改节点 txt_desc 的文本为"Hello fightsyj",使用 getChildByName() 方法:
node_main:getChildByName("node_center"):getChildByName("txt_desc"):setString("Hello fightsyj")
如果想直接一步到位使用:
node_main:getChildByName("txt_desc"):setString("Hello fightsyj")
是无法获取到节点 txt_desc 的,会报错!
当然,想一步到位也是可以的!封装一个工具函数去递归遍历获取目标子节点:
--[[
递归遍历获取目标子节点
@params parentNode(Node) 父节点
@params childName(string) 目标子节点名称
@return targetNode(Node) 目标子节点
]]
Utils.getChildByNameEx = function(parentNode, childName)
if not parentNode or not childName then
return nil
end
if parentNode:getName() == childName then
return parentNode
end
local children = parentNode:getChildren()
for _, childNode in pairs(children) do
local targetNode = Utils.getChildByNameEx(childNode, childName)
if targetNode then
return targetNode
end
end
return nil
end
这样就可以一步到位了:
Utils.getChildByNameEx(node_main, "txt_desc"):setString("Hello fightsyj")
ps:
-
使用这种方式获取子节点需要保证子节点名称在这个父节点下唯一,否则不能保证获取到你想要获取的那一个子节点!
-
使用这种方法的时候层级跨度不要太大,毕竟递归是很消耗性能的。最好和 getChildByName() 配合使用!
-
熬了个夜,该如何拯救我的黑眼圈呢~