AS3 class:访问未定义的方法/属性 错误
AS3 class : access of undefined method / property errors
我有这个 class :
package {
import flash.net.SharedObject;
import flash.display.DisplayObject;
public class gestioneMultilingua
{
public static function settaLingua(lingua:String):void
{
var dati:SharedObject = SharedObject.getLocal("datiApp", "/");
dati.data.lingua = lingua;
dati.flush();
}
public static function applicaFiltriLingua():void
{
var dati:SharedObject = SharedObject.getLocal("datiApp", "/");
var lingua : String = dati.data.lingua;
for(var i:int = 0; i<numChildren; i++){
var e:Object = getChildAt(i);
if(e.name.indexOf("$"+lingua) >= 0){
e.visible = true;
}
else if(e.name.indexOf("$") >= 0){
e.visible = false;
}
}
}
}
}
但我遇到了这些错误:
我该如何修复它们?也许我需要导入一个包?
一个静态方法只能调用另一个静态方法。 numChildren 和 getChildAt 不是静态方法,从静态方法内部调用它们只会产生错误。即使您的 class 正在扩展 DisplayObjectContainer 它仍然会出现这些错误,因为 class 的实例将具有 getChildAt 方法和 numChildren 属性 但在静态级别它们仍然不存在并且仍然会产生错误。
不要使您的 applicaFiltriLingua 方法静态化并扩展有效的 DisplayObjectContainer
由于您的函数是 STATIC 函数,因此您永远无法实例化一个函数,并且不允许所有类型的非静态字段。也不允许使用实例构造函数,class 会自动密封。
使方法非静态并实例化 class "gestioneMultilingua"
var multilingua:gestioneMultilingua = new gestioneMultilingua();
你可以像那样访问它multilingua.applicaFiltriLingua(//参考舞台)
和
做
public function applicaFiltriLingua(stage_ref:MovieClip):void
{
var dati:SharedObject = SharedObject.getLocal("datiApp", "/");
var lingua : String = dati.data.lingua;
for(var i:int = 0; i<numChildren; i++){
var e:Object = stage_ref.getChildAt(i);
if(e.name.indexOf("$"+lingua) >= 0){
e.visible = true;
}
else if(e.name.indexOf("$") >= 0){
e.visible = false;
}
}
}
当你正确使用它时,你可以毫无问题地使用静态函数,当然,这里的问题不在于该函数是静态的(并且不使用 numChildren
或调用 getChildAt()
静态函数),但它是关于你是如何做到的。
在您的情况下,您想要使用 DisplayObjectContainer
的 children,因此您可以简单地将 object 传递给 applicaFiltriLingua()
函数,如下所示:
public static function applicaFiltriLingua(container:DisplayObjectContainer):void
{
var dati:SharedObject = SharedObject.getLocal("datiApp","/");
var lingua:String = dati.data.lingua;
for (var i:int = 0; i < container.numChildren; i++)
{
var e:DisplayObject = container.getChildAt(i);
if (e.name.indexOf("$" + lingua) >= 0) {
e.visible = true;
} else if (e.name.indexOf("$") >= 0) {
e.visible = false;
}
}
}
然后你就可以毫无问题地调用你的函数了,例如:
import gestioneMultilingua;
gestioneMultilingua.applicaFiltriLingua(this);
希望能帮到你。
我有这个 class :
package {
import flash.net.SharedObject;
import flash.display.DisplayObject;
public class gestioneMultilingua
{
public static function settaLingua(lingua:String):void
{
var dati:SharedObject = SharedObject.getLocal("datiApp", "/");
dati.data.lingua = lingua;
dati.flush();
}
public static function applicaFiltriLingua():void
{
var dati:SharedObject = SharedObject.getLocal("datiApp", "/");
var lingua : String = dati.data.lingua;
for(var i:int = 0; i<numChildren; i++){
var e:Object = getChildAt(i);
if(e.name.indexOf("$"+lingua) >= 0){
e.visible = true;
}
else if(e.name.indexOf("$") >= 0){
e.visible = false;
}
}
}
}
}
但我遇到了这些错误:
我该如何修复它们?也许我需要导入一个包?
一个静态方法只能调用另一个静态方法。 numChildren 和 getChildAt 不是静态方法,从静态方法内部调用它们只会产生错误。即使您的 class 正在扩展 DisplayObjectContainer 它仍然会出现这些错误,因为 class 的实例将具有 getChildAt 方法和 numChildren 属性 但在静态级别它们仍然不存在并且仍然会产生错误。
不要使您的 applicaFiltriLingua 方法静态化并扩展有效的 DisplayObjectContainer
由于您的函数是 STATIC 函数,因此您永远无法实例化一个函数,并且不允许所有类型的非静态字段。也不允许使用实例构造函数,class 会自动密封。
使方法非静态并实例化 class "gestioneMultilingua"
var multilingua:gestioneMultilingua = new gestioneMultilingua();
你可以像那样访问它multilingua.applicaFiltriLingua(//参考舞台) 和 做
public function applicaFiltriLingua(stage_ref:MovieClip):void
{
var dati:SharedObject = SharedObject.getLocal("datiApp", "/");
var lingua : String = dati.data.lingua;
for(var i:int = 0; i<numChildren; i++){
var e:Object = stage_ref.getChildAt(i);
if(e.name.indexOf("$"+lingua) >= 0){
e.visible = true;
}
else if(e.name.indexOf("$") >= 0){
e.visible = false;
}
}
}
当你正确使用它时,你可以毫无问题地使用静态函数,当然,这里的问题不在于该函数是静态的(并且不使用 numChildren
或调用 getChildAt()
静态函数),但它是关于你是如何做到的。
在您的情况下,您想要使用 DisplayObjectContainer
的 children,因此您可以简单地将 object 传递给 applicaFiltriLingua()
函数,如下所示:
public static function applicaFiltriLingua(container:DisplayObjectContainer):void
{
var dati:SharedObject = SharedObject.getLocal("datiApp","/");
var lingua:String = dati.data.lingua;
for (var i:int = 0; i < container.numChildren; i++)
{
var e:DisplayObject = container.getChildAt(i);
if (e.name.indexOf("$" + lingua) >= 0) {
e.visible = true;
} else if (e.name.indexOf("$") >= 0) {
e.visible = false;
}
}
}
然后你就可以毫无问题地调用你的函数了,例如:
import gestioneMultilingua;
gestioneMultilingua.applicaFiltriLingua(this);
希望能帮到你。