我试图了解一旦场景被破坏后如何有效地删除场景对象。根据{{3}},可以将对象插入到self.view中,以便在场景被破坏后进行清理。
这是我正在尝试的代码
local composer = require( "composer")
local scene = composer.newScene()
local rects={}
local rectsNum = 0
local rectsCount = 0
local rectsTimer
local sceneGroup
local function rectTransComplete( obj )
print("rectTransComplete .. called")
rectsCount = rectsCount + 1
if rectsCount == 3 then
composer.removeScene("scene2")
end
end
local function spawnRect( )
print("inside spawnrects")
rectsNum = rectsNum + 1
rects[rectsNum] = display.newRect( display.contentWidth/2, 100, 100, 100)
rects[rectsNum]:setFillColor( 1,1,1 )
rects[rectsNum].id = numRect
rects[rectsNum].transition = transition.to( rects[rectsNum], {time = 9000, y = display.contentHeight + 100,
onComplete = rectTransComplete
} )
sceneGroup:insert( rects[rectsNum] )
end
function scene:create( event )
sceneGroup = self.view
end
function scene:show(event)
print("inside create")
if event.phase == "did" then
rectsTimer = timer.performWithDelay( 1000, spawnRect, -1 )
end
end
function scene:hide( event )
-- body
end
function scene:destroy( event )
timer.cancel( rectsTimer )
print("scene Destroyed")
end
scene:addEventListener( "create", scene )
scene:addEventListener( "show", scene )
scene:addEventListener( "hide", scene )
scene:addEventListener( "destroy", scene )
return scene
我似乎工作正常,因为一旦场景被破坏,所有矩形都会从屏幕上移除但是我看到应用程序打印消息" rectTransComplete ..被叫"甚至在场景被摧毁之后。为什么会这样,为什么一旦删除对象就不会自动取消转换。我是否需要通过迭代所有矩形手动取消所有转换并取消每个转换。 rects表怎么样,因为它还包含对rects的引用。我应该手动清理它。如果我需要手动清理所有内容(或大部分内容),使用self.view
的好处是什么?答案 0 :(得分:1)
请注意,如果您使用运行时事件将事件传播到显示对象,则也会遇到同样的问题。
几天前我遇到了同样的问题,有两种方法可以解决这个问题:
方法1:保持对打开的转换的引用,遍历所有引用并在它们上调用transition.cancel(transitionReference)。
方法2:在矩形对象中创建一个侦听器,当场景被销毁时触发侦听器时将运行时事件发送到矩形对象,并在侦听器内部取消"取消"链接到当前矩形的转换(transition.cancel(rectangle)) 如果需要使用howto来处理运行时事件,可以查看本文:http://www.engelteddy.com/softwaredevelopment/mobiledevelopment/observer-pattern-corona-sdk/
答案 1 :(得分:0)
你需要在scene:destroy function。中调用transition.cancel()。