Ваш вопрос немного сложен для понимания, но это то, что я делаю из него: у вас есть фиксированное количество SpanElements, и вы хотите заменить текст каждого Span текстом, который находится в массиве (который имеет длина равна количеству пролетов). Пожалуйста, поправьте меня, если я ошибаюсь.
Кроме того, из вашего кода я предполагаю, что каждый Span имеет свой собственный абзац. Немного примерно так:
<s:TextFlow id="mytextflow">
<s:p><s:span>old A</s:span></s:p>
<s:p><s:span>old B</s:span></s:p>
</s:TextFlow>
, и вы хотите заменить его значениями, например, из :
var line_text:Array = ["new A", "new B"];
Сначала я покажу вам, как это сделать, а затем скажу, где ваш код неверен.
Решение
var textLines:Array = ["new A", "new B"];
//we know all children of mytextflow are ParagraphElements
var paragraphs:Array = mytextflow.mxmlChildren;
var numParagraphs:int = paragraphs.length;
//loop over the ParagraphElements
for (var i:int=0; i<numParagraphs; i++) {
//we know the ParagraphElement only contains one SpanElement,
//so we can get it through getFirstLeaf() and cast it as a SpanElement
var span:SpanElement = paragraphs[i].getFirstLeaf() as SpanElement;
//if it really is a SpanElement, we can set its 'text' property
if (span) span.text = textLines[i];
}
Если ваш объект TextFlow более сложный, есть еще один способ перебрать все листовые элементы, но это немного сложнее.
Теперь, что не так с вашим кодом:
сначала вы создаете новый SpanElement и новый ParagraphElement. Затем в следующих 2 строках вы просто перезаписываете эти переменные. Это совершенно не нужно. Это как писать: var s:String = "a"; s = "b";
вы пытаетесь найти промежуток до findLeaf(ii)
. Аргумент, который должен быть передан в 'findLeaf', является индексом определенного символа в тексте, для которого вы хотите найти SpanElement, который содержит этот символ. Нет, как вы, наверное, предполагаете, какой-то индекс SpanElement в объекте TextFlow.
- Вы снова добавляете Span к Абзацу. Это не сломает ваш код, но это полностью избыточно. Все, что вам нужно сделать, это заменить свойство 'text'.
- вы вызываете
updateAllControllers()
при каждом проходе в цикле. Это также избыточно и приведет к проблемам с производительностью больших текстов. Достаточно назвать его только один раз после того, как все тексты были заменены (и я на самом деле думаю, что вам вообще не нужно его называть, поскольку вы на самом деле не меняете раскладку).