项目需求:提供一个共用的红点功能
设计:注册与反注册的管理器,定义红点枚举类型
? ? ? ? ? ?连接管理器的基类,基类中提供外部调用的接口
实现:
--红点类型
RedDotMgrType =
{
MailPanel_Red = 1, --邮件系统
}
---@private
function RedDotMgr:ctor()
self:Clear()
end
---@private
function RedDotMgr:Clear()
self.msgMap = {}
self.MsgNum = {}
end
---@private
function RedDotMgr:OnDestroy()
self:Clear()
end
---@public 注册
---@param type RedDotMgrType 消息类型
function RedDotMgr:regEvent(type, obj, func)
local Num = self.MsgNum[type] or 0
if not self.msgMap[type] then
self.msgMap[type] = {}
else
for i,v in pairs(self.msgMap[type]) do
if v.obj == obj and v.func == func then
error(string.format(" RedDotMgr duplicate add type:%s", tostring(type)))
end
end
end
table.insert(self.msgMap[type], { obj = obj, func = func })
if func then
func(obj, Num)
end
end
---@public 反注册
---@param type RedDotMgrType 消息类型
function RedDotMgr:unRegEvent(type, obj)
if self.msgMap[type] then
for i,v in pairs(self.msgMap[type]) do
if v.obj == obj then
table.remove(self.msgMap[type], i)
break
end
end
end
end
---@public 通知刷新
---@param type RedDotMgrType 消息类型
function RedDotMgr:sendEvent(type, num)
self.MsgNum[type] = num
if self.msgMap[type] then
for i,v in pairs(self.msgMap[type]) do
if v.obj then
v.func(v.obj, num)
end
end
end
end
---@public 获取红点数
---@param type RedDotMgrType 消息类型
function RedDotMgr:GetNum(type)
if self.MsgNum[type] ~= nil then
return self.MsgNum[type]
end
return 0
end
function RedHint:ResetData()
self.type = nil
self.num.text.text = ""
self.numBg:SetActive(false)
end
---@public 初始化
---@param RedDotMgrType 消息类型
function RedHint:Init(type, isShow)
if self.type ~= nil then
RedDotMgr:unRegEvent(self.type, self)
end
self.type = type
RedDotMgr:regEvent(type, self, self.UpdateNum)
end
---@private 回调
function RedHint:UpdateNum(Num)
if Num > 0 then
self.numBg:SetActive(true)
else
self.numBg:SetActive(false)
end
self.num.text.text = tostring(Num)
end
---@public 获取数量
function RedHint:GetNum()
if self.type ~= nil then
return RedDotMgr:GetNum(self.type)
end
LuaLogger.ds(" RedHint GetNum self.type = nil", self.type)
return 0
end
function RedHint:OnDestroy()
self:unRegEvent()
end
---反注册
function RedHint:unRegEvent()
if self.type ~= nil then
RedDotMgr:unRegEvent(self.type, self)
end
self.type = nil
self.num.text.text = ""
self.numBg:SetActive(false)
end
简单示例,若有问题,欢迎童鞋们留言指点哦。
|