self.view对象清理

时间:2014-07-08 19:42:00

标签: lua corona

我试图了解一旦场景被破坏后如何​​有效地删除场景对象。根据{{​​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

的好处是什么?

2 个答案:

答案 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()。