为什么 Corona SDK 的场景隐藏事件未被触发?为什么定时器仍然在控制台打印信息,即使我已经移除了场景?

这是我如何开启定时器的:

local composer = require( "composer" )
local scene = composer.newScene()

timersArray = {}

function scene:create( event )

  function performTimedEvents(timeString)

  local function onTimer( event )
      local params = event.source.params
      if(arg == 5) then
        timer.cancel( event.source )
        return
      end
  end

  for i=1,10 do
      --print("performWithDelay "..sliceStars(timeString)[i])
      timersArray[i] = timer.performWithDelay( 1000*sliceStars(timeString)[i], onTimer )
      timersArray[i].params = { n = i }
  end

  end

  performTimedEvents(pagesTimers[currentPage])
end

这是我在离开场景之前取消定时器的方法,但是当我离开场景时它们仍然存在,定时器仍然在控制台打印信息……特别注意此行 timer.cancel(timersArray[j])

function flushTimers()
  pageSequence(5)
  print("QQQtimersArray")
  print_r(timersArray)
  for j=1,#timersArray do
    print("didCancelTimer "..j)
    timer.cancel(timersArray[j])
    --timer.pause(timersArray[j])
    timersArray[j] = nil
  end
  timersArray = {}
  print_r(timersArray)
  print("didReturn");
end

另外,为什么 scene:hide 没有被触发,以前有 exit 的时候它还可以工作,但是现在它会输出 hide 回调,但不是 hide 事件,请帮助 :(

function scene:hide( event )

print("YYY_hide_!!!")

local sceneGroup = self.view
local phase = event.phase

if ( phase == "will" ) then
    print("YYY_hide_will")
    -- Called when the scene is on screen (but is about to go off screen)
    -- Insert code here to "pause" the scene
    -- Example: stop timers, stop animation, stop audio, etc.
elseif ( phase == "did" ) then
    print("YYY_hide_did")
    -- Called immediately after scene goes off screen
end
end

function scene:destroy( event )

local sceneGroup = self.view

-- Called prior to the removal of scene's view
-- Insert code here to clean up the scene
-- Example: remove display objects, save state, etc.

--myAudioPlayer = nil
--audio.stop()
--audio.rewind(1)
flushTimers()
--timersArray = nil

print("YYY_destroy_did")
end

scene:addEventListener( "create", scene )
scene:addEventListener( "show", scene )
scene:addEventListener( "hide", scene )
scene:addEventListener( "destroy", scene )

顺便说一下,这是我移除当前场景的方法:

      composer.removeScene("currentScene")
      composer.gotoScene("nextScene",effectOptions)
点赞
用户1569297
用户1569297

当在 scene:hide() 事件中的 phasedid 时,应该取消你的定时器:

function scene:hide( event )

    print("YYY_hide_!!!")

    local sceneGroup = self.view
    local phase = event.phase

    if ( phase == "will" ) then
        print("YYY_hide_will")
        -- 当场景在屏幕上但即将离开时调用
        -- 在这里插入代码以“暂停”场景
        -- 示例:停止定时器、停止动画、停止音频等
    elseif ( phase == "did" ) then
        print("YYY_hide_did")
        -- 当场景离开屏幕后立即调用
        flushTimers()
        composer.removeScene("sceneName") -- 示例:移除主场景
    end
end
2016-08-08 13:10:16