|
|
|||||
[+4 06.05.14]
|
Удаление детей в цикле
Есть большой контейнер в нем сотня разных клип-классов, мне нужно удалить только одну группу.
Дано контейнер А. В нем изначально 100 клипов одного класса. Затем в контейнер добавляются еще дети, но уже другого класса. Вопрос Если не так, то как? Ведь индексы сдвигаются после удаления. Дело в том, что я конечно знаю что индексация идет со 100, и проблем в удалении не вижу, но хочется рациональный способ для любой ситуации.
__________________
Марк Tween |
|
|||||
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
может кто-то сочтет это быдлокодерством, но я бы сделал так:
перед циклом создал пустой массив, пробежался бы по детям, так же как сделал ты, но вместо удаления, затолкал бы нужное в этот массив, а потом уже пробежкой по этому массиву в обратном порядке, снес бы все ненужное |
|
|||||
|
|
|||||
[+4 06.05.14]
|
как вариант - не прокатит )) То что индекс мы уменьшили это хорошо, а вот конечное значение цикла не меняется.
Goodguy , не могу сказать , что это быдлокодство, этот вариант и так понятен, я думаю должен же быть какой то красивый вариант
__________________
Марк Tween |
|
|||||
Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
|
Начните конечным значением индекса, а заканчивайте нулем.
|
|
|||||
Цитата:
package { import flash.display.DisplayObject; import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; public class TestProject extends Sprite { public function TestProject() { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(event:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); for (var i:int = 0; i < 5; i++) if (Math.random() > 0.5) addChild(createSprite(i)); else addChild(createMovieClip(i)); for (var j:int = 0; j < numChildren; j++) { trace(getChildAt(j)); var co:DisplayObject = getChildAt(j); if (co is MovieClip) removeChildAt(j--); // В итоге останутся только белые кружки спрайтов. } } private function createSprite(i:int):Sprite { var s:Sprite = new Sprite(); s.graphics.lineStyle(1); s.graphics.beginFill(0xFFFFFF); s.graphics.drawCircle(i * 20 + 10, i * 20 + 10, 20); return s; } private function createMovieClip(i:int):Sprite { var m:MovieClip = new MovieClip(); m.graphics.lineStyle(1); m.graphics.beginFill(0x5555FF); m.graphics.drawCircle(i * 20 + 10, i * 20 + 10, 20); return m; } } } Последний раз редактировалось bav; 25.07.2011 в 15:15. |
|
|||||
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Сделайте обратный цикл от numchildren до 0
UPD опередили)
__________________
Отряд Котовскага |
|
|||||
[+4 06.05.14]
|
Все верно bav , только я тут немного условия не указал видимо....
Вот пример private function cancelBet(e:MouseEvent):void { for (var i:int = 0 ; i < _TB.numChildren; i++ ) { var co:DisplayObject = _TB.getChildAt(i); var a:Boolean = co is Coin; var b:Boolean = (co as Coin).code == _serverBetCode; // тут ругаемся if (a && b ) _TB.removeChildAt(i--) ; } } если без ремува, а ставить просто трейс все окей, ошибок нет. вывод верный
__________________
Марк Tween |
|
|||||
может вернуть null, если co не Coin.
|
|
|||||
Регистрация: Dec 2006
Адрес: 66°32′00″ с. ш. 66°38′00″ в. д.
Сообщений: 85
|
|
Часовой пояс GMT +4, время: 11:02. |
|
« Предыдущая тема | Следующая тема » |
|
|