2009-05-12 4 views
2

У меня есть система меню, которую я создал во Flash, которая позволяет вам выбирать элемент и перемещать его вверх или вниз. Если объект удален из меню, я хочу, чтобы выбранный элемент был установлен в нуль, поэтому он больше не будет пытаться перемещаться.Flash AS3 - объект не получает значение null

У меня есть глобальные (для текущего вИДЕО сроки) переменная:

var selectedPlaylistItem:MovieClip; 

Это магазины, какой пункт меню выбран (пункты меню только в кино клипы), и если этот элемент будет удален, я поставил выбранный элемент нуль:

function removeFromPlaylist(sender:playlist_content_item) { 
    if(sender == selectedPlaylistItem) { 
     //Not sure why this isn't working, but at some point I need to figure it out. 
     selectedPlaylistItem = null; 
     trace(selectedPlaylistItem); 

это след покажет нуль без каких-либо проблем, но в моей следующей функции, которая перемещает элементы вверх, после того как я поставил его в нулевое значение, по-прежнему установлен на объекте, что это было до его удаления:

function playlistUp(sender:MovieClip) { 
    trace(selectedPlaylistItem); 

Эта трасса покажет оригинальный объект.

Кто-нибудь знает, почему это не сработает? Почему бы просто не остаться нулевым после того, как он был установлен таким образом?

Благодаря


UPDATE:

Так что я попытался это, чтобы увидеть, если бы я мог понять, что происходит:

this.selectedPlaylistItem = null; 
    trace(selectedPlaylistItem); 
    setTimeout(function() {trace(selectedPlaylistItem);}, 4000); 

Но когда след происходит спустя 4 секунды, его говорит, что это все еще выбранный объект, хотя след сразу же показывает его как null, и я везде искал код, но нигде он не будет сброшен.

+0

Я подозреваю, что вы сосредоточиваете много энергии на части, которая устанавливает ее в нуль и не замечает реальной проблемы. Вероятно, он сбрасывается на ненулевой другим кодом, который вы не отслеживаете. – jsight

+0

Опубликовать весь сценарий. Скорее всего, что-то простое, что вы просто посмотрели на него так долго. – typeoneerror

ответ

1

Из того, что я вижу, он должен оставаться недействительным. Можете ли вы опубликовать часть своего другого кода, то есть в каком контексте эти две функции вызываются?

+0

Они получают вызовы с нажатий кнопок. Они оба являются функциями одного и того же места в клипе, поэтому я действительно не понимаю, почему это не сработает. –

+0

Я тоже в недоумении. Единственное, о чем я могу думать, это если он не попадает в if в файле removeFromPlaylist ... но вы сказали, что трассировка выводит нуль. Также может быть проблема определения области, где у вас случайно есть две переменные с именем selectedPlaylistItem, но это маловероятно. Попробуйте выполнить его в отладчике (Ctrl + Shift + Enter во Flash CS3/CS4) – Cameron

+0

Я, я определенно попал туда, где он устанавливает его в null. Я прошел через debugugger, это было точно так же, как то, что говорили следы. Переменная не объявлена ​​нигде (я посмотрел, и я бы предположил, что она все равно выкинет ошибку), так что это не проблема. –

1

Где находится этот код 'live'? Если это на временной шкале, ваш код, который может быть вызван в выбранном элементеPlaylistItem, в любом случае, я бы привязал некоторые трассы или точки останова, где вы установили selectedPlaylistItem, чтобы увидеть, неожиданно ли он вызван.

-2

ли все слушатели событий были удалены из объекта и/или вы используете Weak References:

слабая ссылка одна, не подсчитываются сборщика мусора (т.е. не учитывается в качестве ссылки. подсчет, и он не соблюдается при подметании знаков). Это означает, что, если единственные ссылки, остающиеся для объекта, являются слабыми, он будет доступен для сбора при следующей развертке GC.

Ссылки, связанные с прослушивателями событий, часто забываются разработчиками, что обычно приводит к тому, что слушатель никогда не удаляется из памяти. Вот почему слабые ссылки на прослушиватели событий так удобны в AS3 - если вы забудете удалить слушателя, вы не будете препятствовать способности Мусоросборщика собирать объект.

// params: eventName, listener, capturePhase, priority, useWeakReference 
someObj.addEventListener("eventName",myFunct,false,0,true); 
+0

Я действительно не вижу, как это уместно, он не спрашивает, почему переменная не является сборкой мусора. Слушатель событий не должен был устанавливать переменную в значение null. – quoo

0

Случается ли вы код, чтобы быть более двух кадров или больше? Я предполагаю, что он снова запускает код.Таким образом, в прогрессии скрипта он будет установлен в нуль, пока текущий кадр еще не будет рендерить, но если он зацикливается вокруг кадра (скажем) 1, тогда его можно назвать некоторым кодом, чтобы снова установить эту переменную, следовательно вы увидите, что он установил что-то через 4 секунды.

+0

Он находится в клипе с одним фреймом. Я нашел обходной путь, но я до сих пор не понимаю, почему это не оставалось нулевым. –

0

Если на экране отображается selectedPlaylistItem во время запуска removeFromPlaylist(), попробуйте удалить объект из списка отображения, прежде чем обнулить его.