2013-08-29 1 views
1

Я застрял в этом коде, который я создал. Он делает то, что он перебирает все дочерние элементы класса и затем проверяет, имеет ли он свойство приоритета, равное 1. Когда приоритет равен 1, он добавляется в конец дочернего списка. Проблема, с которой я сталкиваюсь, заключается в том, что когда он находит объект с приоритетом 1, он пропускает следующий объект. Это происходит потому, что он перемещает объект до конца, что означает, что весь массив перемещается на одну позицию влево, поэтому он пропускает следующий объект, потому что он считает, что он уже проверил его!Loop children while shifting skips

for (var j:int = 0; j < this.numChildren; j++) 
    { 
     var tempObject:Object = this.getChildAt(j); 
     if (tempObject._priority == 1) 
     { 
      var indexofnew:Number = this.getChildIndex(tempObject as DisplayObject); 
      this.setChildIndex(this.getChildAt(indexofnew),this.numChildren-1); 
     } 

Я столкнулся с полной стеной о том, как это решить. У кого-нибудь есть идея?

+0

Вы имеете в виду, что он проходит через все дочерние элементы в списке отображения данного объекта DisplayObject, правильно? – prototypical

+0

Да, это так. – Banzboy

ответ

1

Вопрос заключается в том, что при перемещении положения конкретного ребенка в списке отображения в конце списка, индекс остальных детей под ним будет уменьшать.

Наилучшим подходом может быть повторение цикла в обратном направлении, поскольку только изменения в дочерних индексах будут уже обработаны DisplayObjects.

for (var j:int = numChildren-1; J >= 0; j--) 
{ 
     var tempObject:Object = this.getChildAt(j); 
     if (tempObject._priority == 1) 
     { 
      var indexofnew:Number = this.getChildIndex(tempObject as DisplayObject); 
      this.setChildIndex(this.getChildAt(indexofnew),this.numChildren-1); 
     } 
} 
+0

Как я прокомментировал решение Чада, этот код работает тоже, но он создает бесконечный цикл. – Banzboy

+0

Вы попробовали эту версию? Я обновил свой ответ. Это не должно приводить к бесконечному циклу, это обратный цикл. – prototypical

+0

Wow thanks! Вот и все. – Banzboy

1

Попробуйте это вместо цикла while. Таким образом, ваш цикл будет только увеличиваться, если нет соответствия. В матче он останется неизменным.

var j = 0; 
while(j < this.numChildren) { 
    var tempObject:Object = this.getChildAt(j); 
    if(tempObject._priority == 1) { 
     var indexofnew:Number = this.getChildIndex(tempObject as DisplayObject); 
     trace(indexofnew+"n"); 
     this.setChildIndex(this.getChildAt(indexofnew),this.numChildren-1); 
    } else { 
     j++; 
    } 
} 
+0

Код работает, но, к сожалению, он становится и бесконечным циклом к ​​концу. Поскольку последние несколько объектов совпадают, он будет продолжать итерацию. – Banzboy

+0

Этот ответ похож на мои первоначальные мысли, но это приведет к бесконечному циклу, потому что, если последний «_priority == 1» последнего дочернего элемента, он не будет итерации 'j', поэтому' j 'всегда будет ниже, чем ' numChildren' в этом случае. – prototypical