Reference Error #1056 !!
There is no single developer in this Flash development world who is unknown of this error. This is one of the most common error we often come across. And there are many scenarios we get trapped in this error.
Skipping the most basic reason of this error, when trying to access a property of an object which does not exist, let me throw some light on couple of other reasons when this error comes.
1. When the "Declare Stage Instances Automatically" feature in ActionScript Settings is turned off. So turning that feature on will remove the error.
2. When TLF TextField is used in a loaded swf.
If you use TLF Engine in a loaded swf, you cannot call a public function of a document class (runtime error function doesn't exist), you cannot cast the swf as its document class or cast it as an interface the document class implements (both cause a coercion error).
In my case TLF text was not required, it was only added by mistake, so I removed the TLF text from my loaded swf and the error was gone.
But, it's an extremely common use case to need one swf to load another swf and need that other swf to have TLF TextFields in it, and also need to call public functions on the swf, or cast the loader.content as the document class or interface.
What do we do in that case?
If you go into the Actionscript settings of the swf using the TLF Engine and changed the Runtime Shared Library Settings Default linkage to "Merged into code" the errors go away. But, the problem with this workaround is that the swf increases in size by 125k.
Why this error?
Here's a very nice explanation of the whole behind the scene story that I came across when I was looking for the "reason" (this error had blown off my head for quite a few days) for my problem.
When you use Loader to load a swf that has an RSL (which, in this case, is the TLF engine), and you load that swf, Adobe's Preloader is what it actually loads. Then, Adobe's Preloader creates a Loader and adds that Loader to its display stack, alongside a Shape that is the visual part of their preloader. Adobe's Preloader then tells its Loader to load your swf.
Once your swf loads, it's already on the stage, so ADDED_TO_STAGE is fired. Then, Adobe's Preloader calls removeChild() on the Loader and the Shape, and then calls addChild(loader.content), which triggers another ADDED_TO_STAGE event. After that, your loaded swf's parent is their Preloader, not their Preloader's Loader.
Now here's where it gets complicated. The Preloader attempts to add a property called __rslLoaders to your document class. If you reference the document class of the loaded swf in your Main document class before you load your swf (such as you write code that casts the loaded swf as your document class, i.e. Other(loader.content) you get a runtime error:
ReferenceError: Error #1056: Cannot create property __rslLoaders on Other.
at fl.rsl::RSLPreloader/contentComplete()
The Loader you use to load your swf fires its COMPLETE event before Adobe's Preloader is finished loading your swf. You cannot listen to Adobe's preloader to know when your swf has actually been loaded and is available, and, as far as I can tell, Adobe's Preloader provides no way to target your swf.
The unfortunate side effect of this is that using TLF makes it difficult to target the timeline of a loaded swf without jumping through some hoops.
Because you cannot bubble events from within the other.swf through the Loader that loaded it to the Main class, your loading class has no way of knowing when your loaded swf is actually available unless you do an ENTER_FRAME listener and loop through the children of MovieClip(loader.content) and look for your interface class (as mentioned above, you cannot cast as the document class or you get a runtime reference error, and you cannot change the ApplicationDomain or the SecurityDomain of Adobe's Preloader's Loader). Then, you need to store a reference to your swf to be able to access it, which means you have to be sure to clear that reference when unloading.
Hope it saves someone's time !!
|
My Blog Title
|