测验app + singleton类as3

时间:2012-07-28 05:45:16

标签: actionscript-3 oop singleton

我的radiobuttons存在问题,因为当我从radiobuttons所在的阶段删除实例时,如果我再次创建实例,则radiobuttons会保留最后一个选择。

(我用西班牙语写了这门课,如果你有问题要确定这个概念,请问我)

Class(crearPregunta.as或askQuestion.as)

package src.com.akkadian

{

import fl.controls.RadioButtonGroup;
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.events.*;
import flash.events.MouseEvent;
import flash.net.*;
import flash.text.*;
import flash.utils.Timer;
import flash.xml.*;
import src.com.akkadian.manipularXML;

public class crearPregunta extends MovieClip
{

    private static var _instance:crearPregunta = null;

    private var xmlPath:String;
    private var radioGroup1:RadioButtonGroup = new RadioButtonGroup("Questions");
    private var xmlLoader:URLLoader = new URLLoader();
    private var instanciaXML:manipularXML;
    protected var time:Timer;
    private var rs:String;
    private var resp:XMLList;
    private var re:XMLList;
    private var pre:XMLList;
    private var opSeleccionada:Number;
    private var resultado:Boolean = false;

    public function crearPregunta()
    {


    }

    public static function getInstance():crearPregunta
    {

        if (_instance == null)
        {

            _instance = new crearPregunta();

        }

        return _instance;
    }

    private function generarContenido()
    {

        // Crea the XML instance from manipularXML class
        this.instanciaXML = manipularXML.generarInstancia();

        // Send the path of the file
        this.xmlPath = "src/com/akkadian/preguntas.xml";

        // Add the listener to proceed when the load is finished        
        xmlLoader.addEventListener(Event.COMPLETE, inXML);
        xmlLoader.load(new URLRequest(this.xmlPath));

        // adding a listener to the button sendResponse
        enviarRespuesta.addEventListener(MouseEvent.CLICK, recibirRespuesta);
        enviarRespuesta.buttonMode = true;

    }

    public function validarRespuesta(opcionSeleccionada:String):Boolean
    {
        // Option chosen
        opSeleccionada = Number(opcionSeleccionada);

        // Generate the content
        generarContenido();

        // Send the result
        return resultado;
    }

    private function inXML(e:Event):void
    {
        // Add the radiobuttons to an Array
        var radios:Array = [casoA, casoB, casoC];

        // Obtain the data from the XML
        var data = instanciaXML.obtenerInfo(e.target.data);


        for each (var nodo:XML in data.pregunta)
        {

            if (nodo.@id == opSeleccionada)
            {
                // Keep the answer for the option chosen
                resp = data.pregunta[opSeleccionada - 1].respuesta;

                // Keep the value for the option chosen
                re = data.pregunta[opSeleccionada - 1].respuesta.@valor;

                // Keep the question
                pre = data.pregunta[opSeleccionada - 1].@pre

                // add the value of the question to the dinamic textfield
                question.text = pre;

                for (var u:uint = 0; u < radios.length; u++)
                {

                    radios[u].group = radioGroup1;
                    radios[u].textField.multiline = true;
                    radios[u].textField.wordWrap = true;
                    radios[u].textField.width = 230;
                    radios[u].textField.height = 100;
                    radios[u].textField.autoSize = TextFieldAutoSize.LEFT;


                    // Add the answers to the labels
                    radios[u].label = resp[u];

                    // Add the answers to the values
                    radios[u].value = re[u];

                }

            }

        }
    }

    private function recibirRespuesta(m:MouseEvent)
    {

        for each (var tre:XML in re)
        {
            // if the value of the answer is equal to the value stored
            if (this.radioGroup1.selection.value == re)
            {
                // Save the result as true
                this.resultado = true;

                // Add the value of the answer to the textfield included on this Instance
                result_txt.text = "Correcto";
            }
            else
            {
                // Save the result as false
                this.resultado = false;

                // Add the value of the answer to the textfield included on this Instance
                result_txt.text = "Incorrecto";
            }
        }

        // Add a function to create a timer
        agregarTimer();

    }

    private function agregarTimer()
    {
        // Setup the timer
        time = new Timer(1000, 1);
        time.addEventListener(TimerEvent.TIMER_COMPLETE, cerrarTimer);
        time.start();

    }

    private function cerrarTimer(t:TimerEvent)
    {
        // Just for information, I verify which are the instances that at present ran in the Main instance
        Main.Instancia.obtenerNombreHijos();

        // Remove the instance askQuestion from the Main
        Main.Instancia.removeChildAt(2);

        // I certify that the instance is deleted
        Main.Instancia.obtenerNombreHijos();

        // I change the instance of the xml class to null
        instanciaXML = null;


    }

}

}

结果:现在发生了什么?

  1. 用户运行琐事:首先,选择开始选项(创建选项网格)
  2. 用户选择一个选项(创建askQuestion实例)
  3. 当用户从radiobuttons中选择选项时(结果显示在result_txt.text上)
  4. 执行计时器
  5. 从Main类
  6. 中删除实例(askQuestion)
  7. 如果用户选择了另一个选项,问题和答案会正确显示,但是,radiobutton保持之前选择的选项,result_txt.text显示此选择的结果..这是错误的,因为,不必选择完成。

  8. 我还有另一种情况..我是这样的: 静态实例a(这里创建了实例c) 静态实例b(这里是操作的结果。获取结果时将删除此实例) 实例c(结果显示) 如何将实例b中的信息发送到实例c,实例是在实例中创建的

2 个答案:

答案 0 :(得分:1)

要在Flash中删除某些内容,或者换句话说为垃圾收集器准备好内容,请尝试从对象中删除所有侦听器,将其从舞台中删除,然后将其设置为null。

答案 1 :(得分:0)

我认为问题是你每次都重复使用相同的单选按钮组,但是你没有重置该单选按钮组的selectedIndex或selectedValue。我相信这可以解决问题:

            radioGroup1.selectedIndex=-1;
            for (var u:uint = 0; u < radios.length; u++)
            {

                radios[u].group = radioGroup1;
                radios[u].textField.multiline = true;
                radios[u].textField.wordWrap = true;
                radios[u].textField.width = 230;
                radios[u].textField.height = 100;
                radios[u].textField.autoSize = TextFieldAutoSize.LEFT;


                // Add the answers to the labels
                radios[u].label = resp[u];

                // Add the answers to the values
                radios[u].value = re[u];

            }
相关问题