Lua监听事件观察者模式

5 篇文章 0 订阅

监听部分

-- 程序运行完成时一定要有输出语句,本工具才能正确展示运行结果。
Event = {}

function Event:new(event)
	local event = event or {}
	setmetatable(event, self)
	self.__index = self
	return event
end

function Event:Instance()
	if not self.instance then
		self.instance = self:new()
		self._listeners = {}
	end
	return self.instance
end

function Event:addEventListener(listener, eventType, callback)
	-- assert(eventType)
	-- assert(type(listener) == 'table')
	-- assert(type(eventType) == 'string')
	-- assert(type(callback) == 'function')
	print(listener, eventType, callback)
	if not self._listeners[eventType] then
		self._listeners[eventType] = {}
	end
	self._listeners[eventType][listener] = callback
end

function Event:delEventListener(listener, evenType)
	if not evenType then
		for ev, es in pairs(self._listeners) do
			es[listener] = nil
		end
	else
		local es = self._listeners[evenType]
		if es then
			es[listener] = nil
		end
	end
end

function Event:dispatchEvent(eventType, ...)
	if not self._listeners then return end
	local callbacks = self._listeners[eventType]
	if callbacks then
		for listener, func in pairs(callbacks) do
			listener[func](listener, ...)
		end
	end
end


调用部分

无参数

A = {}

function A:a()
	local event = Event:Instance()
	event:addEventListener(self, 'eat', 'getName')	
end

function A:getName()
	print("aaaaaaaaaaaaaaaaaaaaaaaaa")
end

function A:set()
	local event = Event:Instance()
	event:dispatchEvent('eat')
end

A:a()--创建监听
A:set()--分发事件


输出:aaaaaaaaaaaaaaaaaaaaaaaaa

有参数

A = {}

function A:a()
	local event = Event:Instance()
	event:addEventListener(self, 'eat', 'getName')	
end

function A:getName(obj)
	print(obj)
end

function A:set(obj)
	local event = Event:Instance()
	event:dispatchEvent('eat',obj)
end

A:a()--创建监听
A:set("11111")--分发事件


输出:11111

Lua中,可以使用Cocos2d-x游戏引擎提供的TableView控件实现列表视图。 要监听TableView的事件,可以通过对TableView对象调用`addEventListenerTableView`方法来注册事件处理器。该方法接受一个回调函数作为参数,当TableView触发事件时,该回调函数将被调用。 以下是一个示例代码,它使用了`addEventListenerTableView`方法来监听TableView的`cc.TABLECELL_TOUCHED`事件: ```lua local function tableCellTouched(table, cell) print("cell touched at index: " .. cell:getIdx()) end local tableView = cc.TableView:create(size) tableView:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL) tableView:setVerticalFillOrder(cc.TABLEVIEW_FILL_TOPDOWN) tableView:setPosition(pos) tableView:setDelegate() tableView:addTo(parent) local function numberOfCellsInTableView(table) return 20 end local function tableCellSizeForIndex(table, index) return cellSize.width, cellSize.height end local function tableCellAtIndex(table, index) local cell = table:dequeueCell() if not cell then cell = cc.TableViewCell:new() end -- configure the cell return cell end tableView:registerScriptHandler(numberOfCellsInTableView, cc.NUMBER_OF_CELLS_IN_TABLEVIEW) tableView:registerScriptHandler(tableCellSizeForIndex, cc.TABLECELL_SIZE_FOR_INDEX) tableView:registerScriptHandler(tableCellAtIndex, cc.TABLECELL_SIZE_AT_INDEX) tableView:addEventListenerTableView(tableCellTouched, cc.TABLECELL_TOUCHED) ``` 在上面的代码中,`tableCellTouched`函数被注册为TableView的`cc.TABLECELL_TOUCHED`事件的回调函数。当用户点击TableView中的任何一个单元格时,该函数将被调用,并且会输出被点击的单元格的索引。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值