Как заменить текст элемента span в текстовом потоке новым значением - PullRequest
0 голосов
/ 09 июля 2011

У меня есть текстовый поток с именем mytextflow, и после того, как я написал текст, я хочу заменить текст другим в массиве.Я использую этот код, он пишет, но заменяет строку вторым элементом в массиве (например, строка 1 со вторым элементом в массиве и т. Д.).

for ( var ii:int = start_index  ; ii <= end_index ; ii++)
{
    add_kashida(ii);
}

function add_kashida(ii)
{
    var leafn:SpanElement = new SpanElement();                
    var p:ParagraphElement = new ParagraphElement();

    leafn = SpanElement(mytextflow.findLeaf(ii));
    p = leafn.getParagraph();

    leafn.text=line_text[ii].toString();

    p.addChild(leafn);

    mytextflow.flowComposer.updateAllControllers();
}

Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 09 июля 2011

Ваш вопрос немного сложен для понимания, но это то, что я делаю из него: у вас есть фиксированное количество 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() при каждом проходе в цикле. Это также избыточно и приведет к проблемам с производительностью больших текстов. Достаточно назвать его только один раз после того, как все тексты были заменены (и я на самом деле думаю, что вам вообще не нужно его называть, поскольку вы на самом деле не меняете раскладку).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...