如图所示,我们实现了点击tableview里的坦克上、下阵,但是有个问题就是当我们滚动tableview松开鼠标的时候会有误操作,而我们需要的效果是滚动时不会选中,不滚动时才会选中。
以下是第一次修改的部分代码:
--点击时调用接口
function BuZhenMainUI:bindItemClickEvent(_cell, _itemIndex)
if _cell == nil then
return
end
local function clickItemEvent()
-- print("select",seletedItemFlag,scrollFlag)
if scrollFlag then
seletedItemFlag = true
return
end
seletedItemFlag = false
scrollFlag = false
local shangZhenImage = ccui.Helper:seekWidgetByName(_cell,"Image_10")
local visibleFlag = shangZhenImage:isVisible()
local tank = self.tankData[_itemIndex]
-- tank._itemIndex =_itemIndex
assert(tank)
if visibleFlag then
shangZhenImage:setVisible(false)
Player:getInstance():deleteGoTank(tank.guid)
self:updateGoTankIndex(tank.goIndex)
tank.goIndex = 0
else
--看上阵是否已满
local goTanks = Player:getInstance():getGoTanks()
if #goTanks >= maxGoTanks then
g_toast(g_dictionaryDesc("Buzhen_info01"))
return
else
shangZhenImage:setVisible(true)
if tank then
Player:getInstance():addGoTank(tank.guid)
tank.goIndex = #goTanks
Player:getInstance():setGoTankIndex(tank.guid,tank.goIndex)
end
end
end
self:resetGoTankPos()
self:updateBuzhen()
end
_cell:addClickEventListener(clickItemEvent)
end
--触摸调用
local function tableCellTouched(_table, _cell)
end
--滚动时调用的接口
local function scrollViewDidScroll(_view)
-- print("scrollViewDidScroll",initFlag,seletedItemFlag)
if not initFlag then
return
end
if seletedItemFlag then
scrollFlag = false
else
scrollFlag = true
end
end
我们加了两个标志,实现了当有滚动松开后不会误选中的问题。但是还有一个问题,就是当点击开始跟滚动后松开时如果是同一个cell没问题,但是当点击开始跟滚动结束松开的时候不在同一个cell时,松开后再次点击没反应了,因为这个时候,不在cell里,所以调不到bindItemClickEvent这个函数,不能把标志还原回来,导致松开后点击无效。
这个时候一种思路是看有无接口能检测什么时候松开,不管是在cell里还是cell外都能检测到,然后我们在这个接口里将标志还原,应该能实现我们想要的效果,但是很遗憾,找了一下没发现有这样的接口,如果哪位朋友知道还请不吝赐教。
然后我们转换思路,因为事件分发器是先触发我们自己绑定的点击事件bindItemClickEvent,然后才是tableview自有的tableCellTouched,且当有滚动时,tableCellTouched不会再触发。这个时候有两种方案,第一种方案如果我们能改变事件的优先级,先触发tableCellTouched,在这里面设置个标志,然后滚动时改变这个标志,然后触发bindItemClickEvent时判断这个标志我们再处理逻辑。但是很遗憾,也没找到改变他们优先级的接口。这种方案更符合我们一般的解题思路。
第二种方案就是先在bindItemClickEvent里设置个标志啥也不干,然后在tableCellTouched里去检查这个标志再处理逻辑,因为如果有滚动的话,tableCellTouched是不会被调用的。
实现部分代码如下:
-- item点击事件
function BuZhenMainUI:bindItemClickEvent(_cell, _itemIndex)
if _cell == nil then
return
end
local function clickItemEvent()
self.curSelectedCell = _itemIndex
self.seletedItemFlag = true
end
_cell:addClickEventListener(clickItemEvent)
end
function BuZhenMainUI:clickItemEvent()
local _itemIndex = self.curSelectedCell
local item = self.tableView:cellAtIndex(_itemIndex-1)
local _cell = item:getChildByTag(99)
local shangZhenImage = ccui.Helper:seekWidgetByName(_cell,"Image_10")
local visibleFlag = shangZhenImage:isVisible()
local tank = self.tankData[_itemIndex]
-- tank._itemIndex =_itemIndex
assert(tank)
if visibleFlag then
shangZhenImage:setVisible(false)
Player:getInstance():deleteGoTank(tank.guid)
self:updateGoTankIndex(tank.goIndex)
tank.goIndex = 0
else
--看上阵是否已满
local goTanks = Player:getInstance():getGoTanks()
if #goTanks >= maxGoTanks then
g_toast(g_dictionaryDesc("Buzhen_info01"))
return
else
shangZhenImage:setVisible(true)
if tank then
Player:getInstance():addGoTank(tank.guid)
tank.goIndex = #goTanks
Player:getInstance():setGoTankIndex(tank.guid,tank.goIndex)
end
end
end
self:resetGoTankPos()
self:updateBuzhen()
self.seletedItemFlag = false
end
local function scrollViewDidScroll(_view)
end
local function tableCellTouched(_table, _cell)
if self.seletedItemFlag and self.curSelectedCell then
self:clickItemEvent()
end
end