在使用 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() 配合使用!
-
熬了個夜,該如何拯救我的黑眼圈呢~