2009-11-25 23 views
5

Tôi có một swf tải một swf bên ngoài. Trình loader swf có một biến mà tôi muốn truy cập từ swf đã tải. Tôi sử dụng số MovieClip(parent.parent).myVar nhưng trả lại lỗi nàyCách truy cập biến của cha mẹ movieclip từ swf đã tải

TypeError: Error #1009: Cannot access a property or method of a null object reference. at card01_fla::MainTimeline/frame1()

Trình tải lên có Lớp tài liệu tùy chỉnh mà tôi nghĩ là vấn đề.

Xin cảm ơn trước.

EDIT

Đây là tính đến swf chính

package 
{ 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.net.URLRequest; 
    import flash.text.TextField; 

    /** 
    * ... 
    * @author chchrist 
    */ 
    public class CardSender extends Sprite 
    { 

     private var loader:Loader; 
     private var viewButtonArray:Array; 
     private var sendButtonArray:Array; 
     private var cardContainer:Sprite; 

     public var testVar:String 

     public function CardSender() { 

      testVar = "it worked!!!"; 
      init(); 
     } 

     private function init() { 
      viewButtonArray = [cardsenderMC.view01, cardsenderMC.view02, cardsenderMC.view03, cardsenderMC.view04]; 

      for each(var viewButton in viewButtonArray) { 
       viewButton.buttonMode = true; 
       viewButton.addEventListener(MouseEvent.CLICK, onViewClick); 
      } 
     } 

     private function onViewClick(e:MouseEvent):void { 
      var cardName = "card"+e.target.name.substring(4)+".swf"; 
      loader = new Loader(); 
      loader.load(new URLRequest(cardName)); 
      loader.contentLoaderInfo.addEventListener(Event.INIT, onCardInit); 
     } 

     private function onCardInit(e:Event):void { 
      addChild(loader); 
      var content:* = loader.content; 
      content.closeButton.addEventListener(MouseEvent.CLICK, onCloseClick); 
     } 

     private function onCloseClick(e:MouseEvent):void { 
      removeChild(loader); 
     } 

    } 
} 

và tôi đang cố gắng để truy cập biến thử nghiệm từ swf tải với mã này

trace(MovieClip(parent.parent).testVar); 

EDIT # 2

Nếu tôi addChild(loader) không có trong onCardInit nhưng trong onViewClick và trong khung đầu tiên của swf đã tải tôi có Object(parent.parent).testVar nó hoạt động ... nhưng tại sao nó không muốn ở bên trong hàm onCardInit?

+0

cái nào đang ném null - cha hoặc mẹ. – Amarghosh

+0

parent.parent đang ném null – chchrist

+0

những gì bạn nhận được cho 'dấu vết (cha mẹ); - loại dữ liệu của nó là gì? – Amarghosh

Trả lời

2

Bạn chỉ có một loader biến và bạn đang tạo ra bốn Loader trường và gán chúng cho nó - vì vậy nếu bạn đang nhấp vào tất cả bốn người trong số họ liên tiếp nhanh chóng, biến số loader sẽ có hiệu quả chứa đối tượng Loader tương ứng với nhấp chuột cuối cùng. Tất cả addChild cuộc gọi của bạn sẽ hoạt động trên đó cùng một đối tượng Loader - những người khác sẽ không được thêm và cha mẹ của họ sẽ tiếp tục là null

Tận dụng những thay đổi sau đây vào mã:

private function onCardInit(e:Event):void 
{ 
    addChild(LoaderInfo(e.currentTarget).loader); 
    var content:DisplayObject = loader.content; 
    trace(content); 
    trace(content.closeButton); 
    content.closeButton.addEventListener(MouseEvent.CLICK, onCloseClick); 
} 

private function onCloseClick(e:MouseEvent):void 
{ 
    trace(e.currentTarget);//should be the closeButton 
    trace(e.currentTarget.parent);//should be the loaded swf 
    trace(e.currentTarget.parent.parent);//should be the Loader object that loaded it 

    //The following will work only if last three traced correctly 
    removeChild(e.currentTarget.parent.parent); 
} 

trả lời cho bản cập nhật sau trong câu hỏi:

If I addChild(loader) in the onViewClick instead of onCardInit , then Object(parent.parent).testVar in the first frame of the loaded swf works. Why doesn't it work if I addChild inside the onCardInit function?

một lần nữa, mà có thể là do bạn đang thêm một đối tượng khác nhau loader - bạn nhấp vào nhiều hơn một viewbuttons? Nhấp vào nút xem và đợi cho đến khi nó được tải để xem nó hoạt động.

+0

Có, tôi đồng ý nhưng vấn đề thực sự của tôi bây giờ là làm thế nào để truy cập từ swf nạp biến testVar. – chchrist

+0

Bạn đang cố truy cập vào đâu? từ constructor của lớp tài liệu? xử lý sự kiện? nút lớp? - Tôi nghĩ rằng một số mã sẽ giúp – Amarghosh

+0

từ khung đầu tiên của swf đã tải – chchrist

0

cố gắng truy tìm cha mẹ và parent.parent, tôi chắc chắn rằng đó là vì một "cha mẹ" aditional

2

parent.parent sai. hãy thử sử dụng:

MovieClip(MovieClip(e.currentTarget.parent).parent).myVar ; 

Bạn phải đúc phụ huynh đầu tiên đối với một số lớp như MovieClip và sau đó nhận được cha mẹ mới MovieClip của này và sau đó nhận được bên trong biến.

0

loader.content KHÔNG phải là tệp movieclip, vì vậy nó không có khả năng giống nhau. hãy thử

myLoadedClip: MovieClip = MovieClip (loader.content);

sau đó myLoadedClip.parent.myVar của bạn sẽ hiển thị lên

bạn có thể muốn xử lý của bạn để bắn vào một sự kiện.COMPLETE thay vì trên Event.INIT

0

Mã dòng duy nhất này trong swf đã tải giải quyết nó! ;)

MovieClip (MovieClip (parent.parent) .root) .play();

Các vấn đề liên quan