مشكلة في محاولة لإنشاء ملاحة مبوبة ديناميكيا بالنص الديناميكي

StackOverflow https://stackoverflow.com/questions/2210438

سؤال

alt text

مرحبا بالجميع، أخلق ملاحة مبوبة من ملف XML. ومع ذلك، لسبب ما، يقوم حلقة بلدي فقط بإنشاء TextFields في علامة التبويب نشط وعلامة تبويب الأخيرة (في هذه الحالة علامة التبويب 4).

> يمكنك معاينة فلاش هنا. (لقد حولت حدود TextField)

مشكلاتي:
1. لا يتم حجم علامة التبويب النشطة (علامة التبويب الملونة الخفيفة) بشكل صحيح بناء على عرض TextField
2. تخطي حلقة لسبب ما لسبب علامات التبويب الأوسطين، ولكنها تحدد بشكل صحيح علامة التبويب 4.

عناوين علامة التبويب XML:

  • هذه هي علامة التبويب الأولى
  • tab 2nd
  • TAB 3RD
  • علامة التبويب 4 والأخيرة

يبدو أن علامات التبويب الثانية والثالثة تحصل عليها بشكل صحيح، ولكن كما ترى أبعد من ذلك، أحصل على خطأ عند محاولة تتبع نص علامة التبويب الواحدة والثالثة.

تحديث ♥: تمت إضافة فئة Tabmenu بأكملها على أمل الحصول على هذا الحل :)أعتقد الآن أن هذا هو المكان الذي تكمن مشكلتي:

// tabNamer creates the active & default textfields
tabNamer(tabNameActive,  Fonts.ActiveTabText,  tabData[0].id); // for ActiveTab
tabNamer(tabNameDefault, Fonts.DefaultTabText, tabData[i].id); // for DefaultTabs

tobnamer. هي وظيفة تحتوي فقط على Textfield، وأعتقد أنني أتفتت بأستوعت في آخر حافة TextField، وهذا هو السبب في عرض النص الرابع والأخير فقط النص. هل هناك طريقة لتسمية المصنف الخاص بي ديناميكيا هي حلقة؟

tabmenu.as (الطبقة بأكملها)

package com.leongaban.TEN.ui
{
import flash.display.DisplayObject;
import flash.display.LineScaleMode;
import flash.display.JointStyle;
import flash.display.MovieClip;
import flash.display.Graphics;
import flash.display.Sprite;
import flash.display.Shape;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.events.TimerEvent;

import com.leongaban.TEN.ui.*;
import com.leongaban.TEN.Global;
import com.leongaban.TEN.model.*;

public class TabMenu extends Sprite
{

    private const position    :Number    = 0;

    private var tabNameDefault:TextField = new TextField();
    private var tabNameActive :TextField = new TextField();
    private var backing       :Shape     = new Shape();
    private var tabData       :Array     = [];
    private var tabArray      :Array     = [];
    private var bgColor       :uint      = 0xF6F6F6; //0xE8E7E7;
    private var borderColor   :uint      = 0xCCCCCC;
    private var borderSize    :uint      = 1;
    private var sizeW         :uint;
    private var sizeH         :uint;
    private var topShadow     :MovieClip;
    private var tileShadow    :MovieClip;
    private var sideShadowL   :MovieClip;
    private var sideShadowR   :MovieClip;


    public function TabMenu():void
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init(e:Event = null):void {

        removeEventListener(Event.ADDED_TO_STAGE, init);

        addChild(backing);
        addChild(topShadow);
    }

    public function drawTabMenu(w, h, color, videoHDiff, ypos):void
    {           
        for (var i in Global.xml..tab) {
            tabData.push( {
                           id:Global.xml..tab[i].@id, 
                           video:Global.xml..tab[i].vid, 
                           title:Global.xml..tab[i].title} );

            //trace("TAB TITLES: "+tabData[i].id);
        }
        //trace("FIRST TAB DATA : "+tabData[0].id[0]+"\n"+tabData[0].video);

        sizeW = w;
        sizeH = h;

        topShadow = new EmptyMov();
        tileShadow = new TileShadow();
        sideShadowL = new SideShadowL();
        sideShadowR = new SideShadowR();
        sideShadowR.x = (sizeW-16) - sideShadowR.width;

        tileShadow.width = sizeW-16;

        topShadow.addChild(tileShadow);
        topShadow.addChild(sideShadowL);
        topShadow.addChild(sideShadowR);

        backing.graphics.beginFill(bgColor);
        backing.graphics.lineStyle(borderSize, borderColor);
        backing.graphics.drawRect(position, position, sizeW-17, videoHDiff);
        backing.graphics.endFill();
        backing.y = tileShadow.height - 1;


        //DRAW THE TABS -------------
        for (i in tabData) 
        {
            //trace("TAB TITLES: "+tabData[i].id);

            var tab    :MovieClip = new TabDefault();
            var active :MovieClip = new TabActive();

            tabArray.push(tab);
            //tab.video = tabData[i].video;
            //tab.title = tabData[i].title;
            tab.addChild(active); // add active tab movieclip to default tab movieclip

            // tabNamer creates the active & default textfields
            tabNamer(tabNameActive,  Fonts.ActiveTabText,  tabData[0].id); // for ActiveTab
            tabNamer(tabNameDefault, Fonts.DefaultTabText, tabData[i].id); // for DefaultTabs

            i < 1 ? active.visible = true : active.visible = false;
            //i < 1 ? tab.addChild(tabNameActive) : tab.addChild(tabNameDefault);
            i < 1 ? tabArray[0].addChild(tabNameActive) : tabArray[i].addChildAt(tabNameDefault,2);

            //tabArray[i].addChildAt(tabNameDefault,2);
            //tab.addChild(tabNameDefault);
            //if (i < 1) { tab.addChild(tabNameActive) }

            trace("i = "+i);
            trace("tabArray["+i+"].getChildAt(2) = "+tabArray[i].getChildAt(2).text);
            trace("tabNameDefault.text = "+tabNameDefault.text);

            // resize the tab background to textfield
            tab.y      =         topShadow.y + 5;
            //     if first size to active textfield + 10    : if not size to default textfield + 10
            tab.width  = i < 1 ? tabNameActive.width + 10    : tabNameDefault.width + 10;
            tab.x      = i < 1 ? 10                          : tabArray[(i-1)].x + (tabArray[(i-1)].width + 3);
            //tab.active = i < 1 ? tab.active = true           : tab.active = false;

            topShadow.addChild(tab);

            tab.mouseChildren = false;
            tab.buttonMode    = true;
            tab.addEventListener(MouseEvent.CLICK, tabClick);
        }

        // set default thumbnails here
        //trace("tabData[0].id : "+tabData[0].id.@id+"\r");
        //trace("tabData[0].video: "+"\r"+tabData[0].video+"\r");
        //trace("tabData[0].titles : "+tabData[0].titles+"\r");
    }

    private function tabNamer(textfield, textFormat, tabText):void
    {
        //trace("TabNamer called");
        textfield.defaultTextFormat = textFormat;
        textfield.border            = false;
        textfield.embedFonts        = false;
        textfield.gridFitType       = "SUBPIXEL";
        textfield.sharpness         = 100;
        textfield.antiAliasType     = flash.text.AntiAliasType.ADVANCED;
        textfield.autoSize          = TextFieldAutoSize.CENTER;
        textfield.selectable        = false;
        textfield.mouseEnabled      = false;
        textfield.x                 = 10;
        textfield.y                 = 4;
        textfield.text              = tabText;
    }

    private function tabClick(e:MouseEvent = null):void
    {
        for (var i in tabArray) {
                //tabArray[i].active = false;
                tabArray[i].getChildAt(1).visible = false;
        }

        //e.target.active = true;
        e.target.getChildAt(1).visible = true;
        trace("Text for button clicked: "+e.target.getChildAt(2).text+"\r");

        //trace("THUMBNAILS FOR TAB: " + e.target.video);
        // pass the video data to the thumbnail class
    }

}

}



وظيفة tabnament

private function tabNamer(textfield, textFormat, tabText):void
{
    //trace("TabNamer called");
    textfield.defaultTextFormat = textFormat;
    textfield.border            = true;
    textfield.embedFonts        = false;
    textfield.gridFitType       = "SUBPIXEL";
    textfield.sharpness         = 100;
    textfield.antiAliasType     = flash.text.AntiAliasType.ADVANCED;
    textfield.autoSize          = TextFieldAutoSize.CENTER;
    textfield.selectable        = false;
    textfield.mouseEnabled      = false;
    textfield.x                 = 10;
    textfield.y                 = 4;
    textfield.text              = tabText;
}



وظيفة tabclick

private function tabClick(e:MouseEvent = null):void
    {
        for (var i in tabArray) {
                //tabArray[i].active = false;
                tabArray[i].getChildAt(1).visible = false;
        }

        //e.target.active = true;
        e.target.getChildAt(1).visible = true;
        trace("Text for button clicked: "+e.target.getChildAt(2).text+"\r");

        //trace("THUMBNAILS FOR TAB: " + e.target.video);
        // pass the video data to the thumbnail class
    }



هذه هي الآثار من وظيفة إنشاء علامات التبويب (وظيفة الطبقة)

i = 0
tabArray[0].getChildAt(2) = This is first tab
tabNameDefault.text = This is first tab
i = 1
tabArray[1].getChildAt(2) = 2nd Tab
tabNameDefault.text = 2nd Tab
i = 2
tabArray[2].getChildAt(2) = The 3rd Tab
tabNameDefault.text = The 3rd Tab
i = 3
tabArray[3].getChildAt(2) = The 4th and last tab
tabNameDefault.text = The 4th and last tab



هذه هي الآثار أحصل عليها عند النقر فوق علامات التبويب (أحاول العثور على الحقول الثانية والثالثة)

//Clicked Tab 1
Text for button clicked: This is first tab

//Clicked Tab 2
RangeError: Error #2006: The supplied index is out of bounds.
at flash.display::DisplayObjectContainer/getChildAt()
at com.leongaban.ui::TabMenu/tabClick()

//Clicked Tab 3
RangeError: Error #2006: The supplied index is out of bounds.
at flash.display::DisplayObjectContainer/getChildAt()
at com.leongaban.ui::TabMenu/tabClick()

//Clicked Tab 4
Text for button clicked: The 4th and last tab



تم اختليق ذهني على كل يوم :( على أمل أي نصيحة أو نصائح أو المتأنق لهذا السبب! :)

هل كانت مفيدة؟

المحلول

المشكلة هي أنك تقوم بإعادة استخدام TextField. TabnameCtive يشير إلى نفس حقل النص من خلال الحلقة.

تخميني هو أن TextField 'TabnameCtive' موجود على المسرح. إذا كان هذا هو الحال، فأنت بحاجة إلى القيام بما يلي:

1) حذف tabnameCtive من المرحلة

2) انتقل إلى مكتبتك والعثور على tabnameactive. انقر بزر الماوس الأيمن والنقر فوق خصائص. تحقق "تصدير الإطار الأول".

3) نافذة تظهر. الآن إعطاء معرف فئة "tabnameactiveclass".

4) العودة إلى التعليمات البرمجية الخاصة بك. ضمن حلقة حلقة، أضف هذا أدناه التصريحات المتغيرة.

var tab:MovieClip = new TabDefault();
var active:MovieClip = new TabActive();
var tabNameActive:TabNameActiveClass = new TabNameActiveClass();

هذه ينبغي الشغل.

خلاصة: في الأساس، تقوم بعمل النص الخاص بك كصف ويجعل مثالا مختلفا منه في الحلقة. الآن، أنت فقط إعادة استخدام المثال، ويتم نقلها أساسا من علامة التبويب من 1 إلى 4 أثناء الإبداع.

edtied ردا على التعليقات أدناه:

إزالة من تعريف الفصل الخاص بك:

private var tabNameDefault:TextField = new TextField();
private var tabNameActive :TextField = new TextField();

ثم أضف مع حلقة الخاص بك:

var tab:MovieClip = new TabDefault();
var active:MovieClip = new TabActive();
var tabNameActive:TextField = new TextField();
var tabNameDefault:TextField = new TextField();

نصائح أخرى

يبدو لي مثل مشكلتك هو إعادة استخدام TextField tabNameDefault. وبعد إليك ما يفعله الكود الخاص بك:

  1. تعيين نص tabNameActive و tabNameDefault إلى بيانات علامة التبويب الأولى
  2. يضيف tabNameActive كطفل من علامة التبويب الأولى
  3. تعيين نص tabNameActive و tabNameDefault إلى بيانات علامة التبويب الثانية
  4. يضيف tabNameDefault كطفل من علامة التبويب الثانية
  5. تعيين نص tabNameActive و tabNameDefaultإلى بيانات علامة التبويب الثالثة
  6. يضيف tabNameDefault كطفل من علامة التبويب الثالثة. هذا يزيلها من علامة التبويب الثانية.
  7. تعيين نص tabNameActive و tabNameDefaultإلى بيانات علامة التبويب الرابعة
  8. يضيف tabNameDefault كطفل من علامة التبويب الرابعة، قم بإزالةها من علامة التبويب الثالثة.

أنت لم تبث كل الكود. على وجه التحديد، لا أرى أي مكان يخلق النصوص. تخميني هو أنك تقوم فقط بإنشاء TextFields (TabnameCtive و TablineFault). يجب أن يكون هناك شيء مثل "Textfield New Text ()" في مكان ما داخل حلقة يخلق علامات التبويب.

يرجى إصلاح المسافة البادئة الكود، من الصعب جدا قراءتها معها في كل مكان. كما أوصي باستخدام A؟ B: C Response حيث ليس من الضروري، خاصة في الحالات التي تستخدمها لأداء البيانات بدلا من التعبيرات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top