Re: [Pyobjc-dev] NibLoader.py: parsing nibs at runtime
Brought to you by:
ronaldoussoren
From: <bb...@ma...> - 2002-11-16 22:31:09
|
On Saturday, November 16, 2002, at 05:19 PM, Just van Rossum wrote: > bb...@ma... wrote: > [ great explanation snipped ] > >> For Outlets, the connection process simply sets the instance variable >> directly, if possible. However, before doing so, it checks to see if >> the object contains the method setOutletName: and, if so, calls that >> method instead, passing the object that it will be connected to as the >> first argument (i.e. if ExampleObject implemented -setRandomObject: it >> would be called instead of just making a direct connection). > > Ok, so the _runtime_ will add instance variables? [talking pure ObjC here] No -- in the case where -setRandomObject: is implemented, there need not be an instance variable named randomObject at all. The connection mechanism assumes that since the developer implemented the -set*: method, the developer is going to take care of doing whatever they want/need with the object passed to the method. In general, think of outlets and actions in the most simplistic possible terms. There truly is no magic in this stuff and it is every bit as simple as it can be. An outlet is just a reference to some object in the NIB file and an action is just a method that will be targeted by some target/action compliant thing in the NIB. >> Hope that helps (and looking at NibLoader, I'm not at all certain how >> the outlets are working... but they do seem to be working fine!)... > > Have a look at this snippet from Todo's nibwrapper.py: > > class ToDoDocumentBase (NSDocument): > "Base class for class 'ToDoDocument'" > calendar = IBOutlet("calendar") > itemList = IBOutlet("itemList") > dayLabel = IBOutlet("dayLabel") > statusList = IBOutlet("statusList") > > The outlets are class attributes, and will be shared by all instances. > Whether > this is correct or not, it is exactly what NibLoader.py mimics. > > Do I understand correctly that these (Python) class attributes are > more or less > "declarations" for the (Cocoa) runtime? Ahhh... now I understand. From the Python-Cocoa template, I see the declaration of.... messageTextField = IBOutlet("messageTextField") ... but, in the implementation, I see... self.messageTextField.setStringValue_( helloString ) ... so, yes, it appears that IBOutlet() creates a declaration for an ivar that is then shared among all classes. Yet, each individual instance gets its own instance variable slot for that particular ivar. Slightly confusing from the Python perspective, definitely. My ObjC background is such that I didn't think twice about it until just now. :-) > PS: should we rename NibLoader.py to something more appropriate, too? Yes, it probably should be renamed as it is not analogous with NSNibLoading at all. I'm not sure what, though. NibClassLoader? b.bum |