Не удается получить доступ к свойству или методу пустой ссылки на объект при доступе к текстовому полю на сцене
Я пытаюсь заполнить динамическое текстовое поле на сцене, но я получаю ошибку выше. текстовое поле, к которому я пытаюсь получить доступ, существует на сцене во фрейме 180. Этот класс расширяет SimpleButton, и это суперкласс, где у меня есть 5 подклассов, которые расширяют этот класс.
Я также попытался создать новый текст вместо доступа к существующему, и у меня была та же ошибка.
package OOPGame{
import flash.display.SimpleButton;
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.text.*;
public class Taste extends SimpleButton{
internal static var sweetNum = 0;
internal static var bitterNum = 0;
internal static var sourNum = 0;
internal static var saltyNum = 0;
internal static var umamiNum = 0;
internal static var recipeNum = 0;
internal static var ingNum = 0;
internal static var recipe:Array = new Array(3);
internal static var recipeOne:Array = new Array;
internal static var recipeTwo:Array = new Array;
internal static var recipeThree:Array = new Array;
internal static var recipeFour:Array = new Array;
internal static var recipeFive:Array = new Array;
protected var taste = "";
protected var rOiO:TextField;
public function Taste() {
addEventListener(MouseEvent.CLICK, onClick);
}
public function getRecipe(obj:Object, num:int):void{
recipe[num] = obj;
trace("recipe: " + recipe);
}
protected function onClick(event:MouseEvent){
if (DraggableIngredient.level == 4)
MovieClip(root).gotoAndStop(76, "Scene 2");
else {MovieClip(root).gotoAndStop(180, "Scene 2");
++recipeNum;
// trace(getRecipe());
if (recipeNum == 1){
for (var i:Object in recipe){
recipeOne[ingNum] = recipe[i];
++ingNum;}
recipeOne[ingNum] = taste;}
else if (recipeNum == 2){
for (i in recipe){
recipeTwo[ingNum] = recipe[i];
++ingNum;}
recipeTwo[ingNum] = taste;}
else if (recipeNum == 3){
for (i in recipe){
recipeThree[ingNum] = recipe[i];
++ingNum;}
recipeThree[ingNum] = taste;}
trace("this's your first recipe "+recipeOne);
//trace(recipeTwo);
//trace(recipeThree);
rOiO = parent.getChildByName("r1i1") as TextField;// here is the error
//rOiO.text = recipeOne[0].toString();
//rOiO = new TextField;
//parent.addChild(rOiO);
}
}
}
}
функция getRecipe вызывается в другом классе, чтобы заполнить рецепт массива, и он работает. это дает мне следующий вывод:
this's your first recipe [object Orange],[object Apple],[object Tomato],Sweet
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at OOPGame::Taste/onClick()
at OOPGame::Sweet/onClick()
и мои подклассы выглядят так:
package OOPGame{
import flash.events.MouseEvent;
public class Sweet extends Taste{
public function Sweet() {
// constructor code
}
override protected function onClick(event:MouseEvent){
++sweetNum;
taste = "Sweet";
super.onClick(event);
}
}
}
Заранее спасибо. Любая помощь будет оценена
1 ответ
Ваш комментарий означает, что вы получаете ошибку при попытке доступа r1i1
от Sweet
который расширяется Taste
:
rOiO = parent.getChildByName("r1i1") as TextField;
Проблема в том, что перед выполнением этой строки кода вы переходите от текущего кадра, на котором Sweet
существует:
MovieClip(root).gotoAndStop(180, "Scene 2");
Я предполагаю, что случай Sweet
не существует в списке отображения кадра 180 сцены 2, в этом случае, parent
нулевой. Так что ошибка на самом деле ссылается на родителя, а не r1i1
,
Есть много способов решить эту проблему. Высоко в списке было бы не использовать сцены / кадры для управления списком отображения. Поскольку я понятия не имею, как выглядит остальная часть вашего приложения, мне было бы сложно провести вас через это.
Хотя это НЕ рекомендуется, одним из способов решения этой проблемы является сохранение ссылки на родительский клип r1i1
и использовать это вместо parent
чтобы получить к нему доступ. Если это не удастся, вы сможете найти более удобный способ доступа r1i1
(с помощью root
возможно).