防止tableview滚动误点击

这里写图片描述

如图所示,我们实现了点击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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值