On Mar 28, 2010, at 6:22 PM, Jonathan Rochkind wrote:
> Note if it were the Java/ObjectiveC methods we were talking about, as you can see from the documentation, you would not be able to call valueForKey("some.key.path") -- you would need to instead use valueForKeyPath() for that. And something.valueForKeyPath("some.key.path") is no more and no less than: something.some().key().path() , it's just a convenience. (in Java letting you avoid the class-casting at every step of invocation; in any language letting you easily pass around method invocation instructions as data, or store them in config files).
Yes, I have discovered that valueForKeyPath is really the method I want. And yes, it is a part of the iPhone development environment. Here are a few more details.
In Dashcode I have defined a data source from an remote XML file, and the XML looks like this:
<waters>
<water>
<name water_id='79'>Agean Sea at Kos, Greece</name>
<collectors>
<collector collector_id='20'>
<last_name>Calarco</last_name>
</collector>
</collectors>
<description>Pascal collected...</description>
</water>
<water>
<name water_id='37'>Amazon River, Peru</name>
<collectors>
<collector collector_id='8'>
<last_name>Morgan</last_name>
</collector>
</collectors>
<description>Mom collected...</description>
</water>
</waters>
I have then bound elements like name, last_name, and description to various interface elements. Through Javascript I have been able to manipulate these elements as well the collector_id attribute. All this works as expected.
Unfortunately, I am unable to access the water_id attribute. While the water_id attribute displays as a part of my data source and list views, whenever I try to actually access the water_id attribute my application crashes as illustrated by the linked screen shot. [1]
To debug the situation I created a button with the following code using the valueForKeyPath, and as you can see I can access other elements and attributes but not the water_id attribute:
function getID(event)
{
// get my data
var d = dashcode.getDataSource( 'list' );
// the following code works
//var r = d.valueForKeyPath( 'selection.collectors.collector.$collector_id' );
// this code works too
//var r = d.valueForKeyPath( 'selection.collectors.collector.last_name' );
// so does this code
//var r = d.valueForKeyPath( 'selection.name' );
// why doesn't this code work! water_id is an attribute of the name element
var r = d.valueForKeyPath( 'selection.name.$water_id' );
// echo
alert( r );
}
What am I doing wrong? Any assistance or pointers would be greatly appreciated.
[1] screen shot - http://infomotions.com/tmp/screen-dump.png
--
Eric Lease Morgan
|