Невозможно удалить дочерний элемент со сцены - if (stage.contains (child1)) {removeChild (child1);} не работает - PullRequest
0 голосов
/ 16 февраля 2012

Звучит глупо, но как я могу убрать определенного ребенка со сцены? например,

function giveMeResult(e:MouseEvent):void
{

if(stage.contains(result))
    {removeChild(result);}

    addChild(result); // this part works fine, but it adds one over another
}

добавляет один результат поверх предыдущего.

Я хочу, чтобы функция "giveMeResult: удаляла" результат ", если он находится на сцене, и добавляла новый.

UPDATE: * результат - это TextField, а result.txt = "" время от времени меняется ...

trace (result.parent); /// gives  [object Stage]
trace (result.stage); /// gives[object Stage]

trace (result.parent != null && result.parent == result.stage); // gives true

когда

result.parent.removeChild(result);

записывается без оператора if - выдает ошибку Ошибка типа: Ошибка # 1009: невозможно получить доступ к свойству или методу ссылки на пустой объект.

когда написано внутри:

if (result.parent !=null && result.parent == result.stage)
{
result.parent.removeChild(result);
}

ничего не происходит и новый дочерний элемент добавляется поверх предыдущего.

Спасибо всем !!! Результат прост :) Все, что мне нужно было сделать, это просто изменить файл result.txt, даже не удаляя его со сцены:)

Ответы [ 5 ]

2 голосов
/ 16 февраля 2012

Вам нужно набрать stage.removeChild(result);, а затем stage.addChild(result);

Edit:

Глядя на функцию, похожую на вашу:

private function func(e:Event) : void {
    if(stage.contains(result)) {
        stage.removeChild(result);
    }

    stage.addChild(result);
}

Единственный способ добавить новый экземпляр TextField result на сцену, не удаляя старый, - это изменить результат. Смотрите этот поток выполнения:

var result : TextField = new TextField();

// An event occurs and func get's called.
// now result will be added to stage.

result = new TextField();

// An event occurs and func get's called again
// This time the stage.contains(..) will return false, since the current result
// is not actually on stage. This will add a second TextField to the stage.
1 голос
/ 16 февраля 2012

Из документов для DisplayObjectContainer.contains () : "Внуки, правнуки и т. Д. Для каждого возвращают значение true."

То есть в любом месте списка отображения, а непросто прямые дети.Вам нужна родительская проверка, на которую указывает Manque, или просто удалить результат из любого места, где оно может быть:

if (result.parent) {result.parent.removeChild(result); }

Хотя, как ни странно, addChild (result) автоматически удалит его из предыдущего родителя - DisplayObject можетбыть только в одном месте в DisplayList за раз, поэтому я не уверен, почему вы видите несколько результатов ...

Возможно ли, что "результат", который вы передали, нерезультат, который уже на сцене?

1 голос
/ 16 февраля 2012

Если я четко понял, что вы хотите, то этот код может вам помочь:

if (result.parent != null && result.parent == result.stage)
{
    // stage itself contains result
    result.parent.removeChild(result);
}
0 голосов
/ 17 февраля 2012

Все, что мне нужно было сделать, это просто изменить result.txt, даже не удаляя его со сцены

0 голосов
/ 16 февраля 2012

Вы пробовали?

MovieClip(root).removeChild(result)

[ПРАВИТЬ]

function giveMeResult(e:MouseEvent):void{
  if(result.parent != null && result.parent == result.stage){
    stage.removeChild(result);
  }

   stage.addChild(result); 
}
...