2010-03-19 18 views
6

Giải pháp:không addChild actionscript đòi hỏi một đối tượng hiển thị đầu tiên

nếu bạn có cùng một vấn đề, addElement() thay vì addChild() là những gì đã làm nó


Tôi cố gắng di chuyển ra khỏi mxml để actionsctipt. Tôi có một số <s:Rect> mà tôi đã tạo và đặt thuộc tính của nó nhưng gặp sự cố khi thêm nó.

var aRect:Rect = new Rect(); 
//set properties like aRect.x, aRect.y, aRect.width, aRect.height 

//tried adding it various ways 
addChild(aRect); 
Application.addChild(aRect); 
Application.application.addChild(aRect); 
stage.addChild(aRect); 

Nhưng tôi tiếp tục nhận được lỗi 1067: ép buộc ngầm của một giá trị kiểu spark.primitives: Rect đến một loại flash.display liên quan: DisplayObject

Nguyên trong mxml, đó là ngay bên trong <s:Application> không được lồng vào bên trong bất kỳ thứ gì

<s:Application> 

    <s:Rect id="aRect" x="10" y="10" width="15%" height="15%"> 
     //then fill code here, removed for readability 
    </s:Rect> 

</s:Application> 

Thỏa thuận này là gì, tôi nghĩ rằng ActionScript sẽ đẹp hơn mxml.

+0

Không bao giờ sử dụng Flex 4 trước đó, –

+0

Ví dụ mã của bạn từ lớp tài liệu hoặc bất kỳ lớp nào khác? – JanD

+0

@JanD, Mã này nằm ngay trong ứng dụng mxml chính (tôi chỉ có một mxml, không có thành phần hoặc bất cứ điều gì), và dĩ nhiên mã actionscript là trong một hàm init() trong thẻ script và được kích hoạt trên createComplete, khá nhiều chính xác các công cụ thông thường. ActionScript thứ. – touB

Trả lời

1

Đó là vì Flex 4 đã thay đổi đáng kể cách phân cấp hiển thị hoạt động trong các ứng dụng dựa trên MXML. Đây là một chút khó hiểu vì addChild() không còn hoạt động đơn giản như bạn muốn nó - bạn phải thêm các phần tử vào một dataprovider, và sau đó là logic hiển thị các phần tử đó (các phần tử cần thêm ở đâu, làm sao để da chúng , vv) được xử lý ở nơi khác. Đó là một thay đổi hữu ích, mặc dù, bởi vì nó buộc bạn tách mối quan tâm của bạn một cách rất cụ thể. Khi bạn đã thêm tất cả các phần tử vào dataProvider, bạn có thể hoán đổi các đối tượng Layout theo ý muốn (ngay cả khi đang chạy) để thay đổi giao diện của ứng dụng.

EDIT: Về mặt kỹ thuật, chính nó không phải là chính displayList mà họ đã thay đổi. Đó là thực tế là các đơn vị cơ bản được sử dụng bởi Flex bây giờ là "Nhóm" - thậm chí s: Ứng dụng mở rộng nhóm. Bạn thêm nội dung của bạn vào một Nhóm (hoặc đến ứng dụng cấp cao nhất) và sau đó bạn chỉ định cho nhóm một bố cục để cho biết cách hiển thị các mục bạn đã thêm vào.

+0

Myk là bạn quan tâm đến việc thực hiện một bài đăng blog về điều đó và có thể thêm nó vào câu trả lời của bạn ở đây. Phần về "Một khi bạn đã thêm tất cả các phần tử vào dataProvider, bạn có thể hoán đổi các đối tượng Layout theo ý muốn (ngay cả khi chạy) để thay đổi giao diện của ứng dụng." đặc biệt thú vị và có lẽ dễ hiểu hơn với mã hơn từ. Cảm ơn. – touB

+0

Ha, tôi cho rằng ai đó có lẽ nên viết lên - Tôi biết rằng Cookbook Flex 4 từ O'Reilly báo chí thực hiện một công việc thực sự tốt để giải thích nó. Điều đó sẽ được ra sớm. Trong thời gian chờ đợi, tôi sẽ xem xét để có một bài viết hay, tôi chắc chắn có một thứ gì đó ở ngoài đó - nếu tôi tìm thấy nó, tôi sẽ đăng nó ở đây. – Myk

+0

Dưới đây là video hướng dẫn giải thích nó - http://flex4.org/2009/06/23/flex-4-layouts/ Về cơ bản, hầu hết các giao diện Flex 4 (bao gồm s: Ứng dụng) đều có thuộc tính bố cục. Điều đó xác định cách đối tượng được hiển thị và bạn có thể tạo bố cục tùy chỉnh của riêng mình ngoài bốn đối tượng cơ bản. Video giải thích nó khá tốt! – Myk

0

Có, bạn cần DisplayObject. Tôi không quen thuộc với spark.primitives.Rect, nhưng có lẽ bạn chỉ có thể tạo một Sprite và các phương thức gọi mới trên đối tượng Graphics của nó để vẽ hình chữ nhật?

0

Theo tài liệu trực tiếp, phương thức addChild của lớp Ứng dụng yêu cầu nó phải là displayObject.

2

đã thử thay đổi addChild(aRect); thành addElement(aRect); và điều đó hoạt động tốt đẹp.

0

Một cách khó chịu, chúng tôi sẽ thường đấu tranh để thêm tài sản flash (swf swc) (đối tượng hiển thị) sử dụng addElement.

Tôi đang làm việc trên một cách để làm điều này ngay bây giờ :(hơn hoops và nhảy

Cũng SWC của tôi là không thể xem được trong gói thám hiểm (tại sao không?)

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