<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>
<channel>
	<title>Comments on: NSTreeController and Core Data, Sorted.</title>
	<atom:link href="http://espresso-served-here.com/2008/05/13/nstreecontroller-and-core-data-sorted/feed/" rel="self" type="application/rss+xml" />
	<link>http://espresso-served-here.com/2008/05/13/nstreecontroller-and-core-data-sorted/</link>
	<description>Mac applications, brewed to perfection</description>
	<pubDate>Sat, 22 Nov 2008 07:07:20 +0000</pubDate>
	<generator>http://wordpress.org/?v=MU</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Bill Monk</title>
		<link>http://espresso-served-here.com/2008/05/13/nstreecontroller-and-core-data-sorted/#comment-1082</link>
		<dc:creator>Bill Monk</dc:creator>
		<pubDate>Thu, 06 Nov 2008 05:08:40 +0000</pubDate>
		<guid isPermaLink="false">http://jonathandann.wordpress.com/?p=49#comment-1082</guid>
		<description>Hi Jon,

Thanks for fix above. I believe I finally figured out a way to make undo work reliably. The basic problem is that while Core Data correctly does the undo and redo on the data, NSOutlineView doesn't necessarily see the changes and as the display gets out of the sync with the model, eventually an undo/redo command is issued without the correct data on the stack to perform it, resulting in the "NSUndoManager is in invalid state, undo was called with too many nested undo groups" error.

In my my, the user must be able to sort the outline by various criteria, as well as sorting just a few selected rows within any given group. This has to be un-doable,  and however the outline happens to be sorted/subsorted when it's saved, it should re-open with the items in the same order. Obviously, that's where I'm using your sortIndex idea. I set the sort descriptors as needed, update the sortIndices with your -updateSortOrderOfModelObjects method. When the document is re-opened, the sort descriptors are first set to one that sorts by the sortIndex, recreating the previous order. Undo works on everything, sorts, name edits, drag reordering, collapse/expand. 

To get undo working in your sample project, I downloaded a fresh copy and made these changes. It may not be the best way, but it does seems to work.

1) In ESTreeController.m, change -reloadData so that it expands -and- collapses items according to the reloaded data. This is to prevent the problem of collapsing a group item, undo it and having work, then redoing and having the Edit menu flash correctly (indicating there was something on the stack that gets redone) but there being no visible change.

Something like:

- (void)reloadData;
{
	[super reloadData];
	NSUInteger row;
	for (row = 0 ; row &#60; [self numberOfRows] ; row++) {
		NSTreeNode *item = [self itemAtRow:row];
		if (![item isLeaf]) {
			if ([[[item representedObject] valueForKey:@"isExpanded"] boolValue])
				[self expandItem:item];
			else
				[self collapseItem:item];
		}
	}
}

=====
2) When Core Data undoes/re-does something, say a sort, the model data is changed correctly, and all the sortIndex values are restored,  the outline view needs to be told to reload its data. NSUndoManagerDidUndoChangeNotification/NSUndoManagerDidRedoChangeNotification work for this. If you allow sorting on criteria other than sortIndex, as described above, Core Data may have changed a bunch of sortIndex values, and to get the un-done sort displayed, we need to tell the treeController to to re-sort by the sortIndex before anything happens to call -updateSortOrderOfModelObjects, which will overwrite all the un- or re-done sortIndexes with the item's current, pre-undone position in the outline. If that makes sense...

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
	
[[NSNotificationCenter defaultCenter] addObserver:self 
											 selector:@selector(undoManagerDidUndo:) 
												 name:NSUndoManagerDidUndoChangeNotification
											   object:nil];
	[[NSNotificationCenter defaultCenter] addObserver:self 
											 selector:@selector(undoManagerDidRedo:) 
												 name:NSUndoManagerDidRedoChangeNotification
											   object:nil];	
}

- (void)managedObjectsDidChange:(NSNotification *)notification
{
	[outlineView reloadData];
	[treeController setSortDescriptors:nil]; 
	[treeController setSortDescriptors:[self treeNodeSortDescriptors]]; // keep treeController sorted by sortIndex (except during a sort by name, etc)
}

- (void)undoManagerDidUndo:(NSNotification *)notification
{
	[outlineView reloadData];
	[treeController setSortDescriptors:nil]; 
	[treeController setSortDescriptors:[self treeNodeSortDescriptors]]; // keep treeController sorted by sortIndex (except during a sort by name, etc)
}

====
3) I was constantly getting this error

SortedTree Error setting value for key path treeNodeSortDescriptors of object  (from bound object [entity: TreeNode](null)): [ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key treeNodeSortDescriptors.

To stop it, I just turned off the NSTreeController sortDescriptors binding to ESAppDelegate's treeNodeSortDescriptors, and instead, set the sort descriptors in code in -awakeFromNib or -windowControllerDidLoadNib.

====
4) These errors were constantly being logged:

-[ESTreeNode isSpecialGroup]: unrecognized selector sent to instance 0x193e00

-[ESLeafNode isSpecialGroup]: unrecognized selector sent to instance 0x1a4910

[ valueForUndefinedKey:]: the entity Leaf is not key value coding-compliant for the key isExpanded.

-[ESLeafNode canExpand]: unrecognized selector sent to instance 0x171f80

According to  http://www.cocoabuilder.com/archive/message/cocoa/2008/6/9/209710

these seem to be due to a bug in Leopard which causes  the -outlineView: isGroupItem: delegate method to sometimes be sent a dealloced object when Undo/Cmd-Z is used immediately after a creating a new object with CoreData when the NSOutlineView is set to SourceList style in InterfaceBuilder. 

Whew... My fix was just to turn off the source list style. In my app I don't use the style, so changed -outlineView: isGroupItem: to always return NO.

Well, sorry for the long post, but I wanted to report back since your code helped me get my CoreData/NSTreeController app off the ground. Shoot me an email at the address in this form if you'd like the edited project. Thanks again.</description>
		<content:encoded><![CDATA[<p>Hi Jon,</p>
<p>Thanks for fix above. I believe I finally figured out a way to make undo work reliably. The basic problem is that while Core Data correctly does the undo and redo on the data, NSOutlineView doesn&#8217;t necessarily see the changes and as the display gets out of the sync with the model, eventually an undo/redo command is issued without the correct data on the stack to perform it, resulting in the &#8220;NSUndoManager is in invalid state, undo was called with too many nested undo groups&#8221; error.</p>
<p>In my my, the user must be able to sort the outline by various criteria, as well as sorting just a few selected rows within any given group. This has to be un-doable,  and however the outline happens to be sorted/subsorted when it&#8217;s saved, it should re-open with the items in the same order. Obviously, that&#8217;s where I&#8217;m using your sortIndex idea. I set the sort descriptors as needed, update the sortIndices with your -updateSortOrderOfModelObjects method. When the document is re-opened, the sort descriptors are first set to one that sorts by the sortIndex, recreating the previous order. Undo works on everything, sorts, name edits, drag reordering, collapse/expand. </p>
<p>To get undo working in your sample project, I downloaded a fresh copy and made these changes. It may not be the best way, but it does seems to work.</p>
<p>1) In ESTreeController.m, change -reloadData so that it expands -and- collapses items according to the reloaded data. This is to prevent the problem of collapsing a group item, undo it and having work, then redoing and having the Edit menu flash correctly (indicating there was something on the stack that gets redone) but there being no visible change.</p>
<p>Something like:</p>
<p>- (void)reloadData;<br />
{<br />
	[super reloadData];<br />
	NSUInteger row;<br />
	for (row = 0 ; row &lt; [self numberOfRows] ; row++) {<br />
		NSTreeNode *item = [self itemAtRow:row];<br />
		if (![item isLeaf]) {<br />
			if ([[[item representedObject] valueForKey:@&#8221;isExpanded&#8221;] boolValue])<br />
				[self expandItem:item];<br />
			else<br />
				[self collapseItem:item];<br />
		}<br />
	}<br />
}</p>
<p>=====<br />
2) When Core Data undoes/re-does something, say a sort, the model data is changed correctly, and all the sortIndex values are restored,  the outline view needs to be told to reload its data. NSUndoManagerDidUndoChangeNotification/NSUndoManagerDidRedoChangeNotification work for this. If you allow sorting on criteria other than sortIndex, as described above, Core Data may have changed a bunch of sortIndex values, and to get the un-done sort displayed, we need to tell the treeController to to re-sort by the sortIndex before anything happens to call -updateSortOrderOfModelObjects, which will overwrite all the un- or re-done sortIndexes with the item&#8217;s current, pre-undone position in the outline. If that makes sense&#8230;</p>
<p>- (void)applicationDidFinishLaunching:(NSNotification *)aNotification<br />
{</p>
<p>[[NSNotificationCenter defaultCenter] addObserver:self<br />
											 selector:@selector(undoManagerDidUndo:)<br />
												 name:NSUndoManagerDidUndoChangeNotification<br />
											   object:nil];<br />
	[[NSNotificationCenter defaultCenter] addObserver:self<br />
											 selector:@selector(undoManagerDidRedo:)<br />
												 name:NSUndoManagerDidRedoChangeNotification<br />
											   object:nil];<br />
}</p>
<p>- (void)managedObjectsDidChange:(NSNotification *)notification<br />
{<br />
	[outlineView reloadData];<br />
	[treeController setSortDescriptors:nil];<br />
	[treeController setSortDescriptors:[self treeNodeSortDescriptors]]; // keep treeController sorted by sortIndex (except during a sort by name, etc)<br />
}</p>
<p>- (void)undoManagerDidUndo:(NSNotification *)notification<br />
{<br />
	[outlineView reloadData];<br />
	[treeController setSortDescriptors:nil];<br />
	[treeController setSortDescriptors:[self treeNodeSortDescriptors]]; // keep treeController sorted by sortIndex (except during a sort by name, etc)<br />
}</p>
<p>====<br />
3) I was constantly getting this error</p>
<p>SortedTree Error setting value for key path treeNodeSortDescriptors of object  (from bound object [entity: TreeNode](null)): [ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key treeNodeSortDescriptors.</p>
<p>To stop it, I just turned off the NSTreeController sortDescriptors binding to ESAppDelegate&#8217;s treeNodeSortDescriptors, and instead, set the sort descriptors in code in -awakeFromNib or -windowControllerDidLoadNib.</p>
<p>====<br />
4) These errors were constantly being logged:</p>
<p>-[ESTreeNode isSpecialGroup]: unrecognized selector sent to instance 0&#215;193e00</p>
<p>-[ESLeafNode isSpecialGroup]: unrecognized selector sent to instance 0&#215;1a4910</p>
<p>[ valueForUndefinedKey:]: the entity Leaf is not key value coding-compliant for the key isExpanded.</p>
<p>-[ESLeafNode canExpand]: unrecognized selector sent to instance 0&#215;171f80</p>
<p>According to  <a href="http://www.cocoabuilder.com/archive/message/cocoa/2008/6/9/209710" rel="nofollow">http://www.cocoabuilder.com/archive/message/cocoa/2008/6/9/209710</a></p>
<p>these seem to be due to a bug in Leopard which causes  the -outlineView: isGroupItem: delegate method to sometimes be sent a dealloced object when Undo/Cmd-Z is used immediately after a creating a new object with CoreData when the NSOutlineView is set to SourceList style in InterfaceBuilder. </p>
<p>Whew&#8230; My fix was just to turn off the source list style. In my app I don&#8217;t use the style, so changed -outlineView: isGroupItem: to always return NO.</p>
<p>Well, sorry for the long post, but I wanted to report back since your code helped me get my CoreData/NSTreeController app off the ground. Shoot me an email at the address in this form if you&#8217;d like the edited project. Thanks again.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jonathan Dann</title>
		<link>http://espresso-served-here.com/2008/05/13/nstreecontroller-and-core-data-sorted/#comment-1074</link>
		<dc:creator>Jonathan Dann</dc:creator>
		<pubDate>Thu, 16 Oct 2008 20:26:04 +0000</pubDate>
		<guid isPermaLink="false">http://jonathandann.wordpress.com/?p=49#comment-1074</guid>
		<description>Hi Bill,

Sorry for the late reply and for not updating that project properly.  I should be moving over to my own server soon where I'll be able to host whatever files I want to!

I realise now that I'd changed my implementation of -[NSTreeController flattenedContent] ages ago to be:

- (NSArray *)flattenedContent;
{
	return [[self flattenedNodes] valueForKey:@"representedObject"];
}

which really helps in cutting down on such copy/paste errors.  You're correct that to be correct in your implementation that ESTreeNode needs a -descendants key.  As I'd written the above method I hadn't run into this one.

I need to have another look at undo, I'm surprised that its works for you. Maybe it was fixed be an OS update?...

Just tried it an it tells me that the undo manager is left in an invalid state with too many nested undo groups. Can you try and reproduce this on your machine?

Jon</description>
		<content:encoded><![CDATA[<p>Hi Bill,</p>
<p>Sorry for the late reply and for not updating that project properly.  I should be moving over to my own server soon where I&#8217;ll be able to host whatever files I want to!</p>
<p>I realise now that I&#8217;d changed my implementation of -[NSTreeController flattenedContent] ages ago to be:</p>
<p>- (NSArray *)flattenedContent;<br />
{<br />
	return [[self flattenedNodes] valueForKey:@&#8221;representedObject&#8221;];<br />
}</p>
<p>which really helps in cutting down on such copy/paste errors.  You&#8217;re correct that to be correct in your implementation that ESTreeNode needs a -descendants key.  As I&#8217;d written the above method I hadn&#8217;t run into this one.</p>
<p>I need to have another look at undo, I&#8217;m surprised that its works for you. Maybe it was fixed be an OS update?&#8230;</p>
<p>Just tried it an it tells me that the undo manager is left in an invalid state with too many nested undo groups. Can you try and reproduce this on your machine?</p>
<p>Jon</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Bill Monk</title>
		<link>http://espresso-served-here.com/2008/05/13/nstreecontroller-and-core-data-sorted/#comment-1065</link>
		<dc:creator>Bill Monk</dc:creator>
		<pubDate>Wed, 08 Oct 2008 19:36:45 +0000</pubDate>
		<guid isPermaLink="false">http://jonathandann.wordpress.com/?p=49#comment-1065</guid>
		<description>Actually a better fix is to add a -descendants method to ESTreeNode, analogous to the category on NSTreeNode. Using children as described above is not quite right; won't fully enumerate complex trees.

In ESTreeNode.m:

- (NSArray *)descendants;
{
	NSMutableArray *array = [NSMutableArray array];
	for (ESTreeNode *child in self.children) {
		[array addObject:child];
		if (![[child isLeaf] boolValue])
			[array addObjectsFromArray:[child descendants]];
	}
	return [[array copy] autorelease];
}</description>
		<content:encoded><![CDATA[<p>Actually a better fix is to add a -descendants method to ESTreeNode, analogous to the category on NSTreeNode. Using children as described above is not quite right; won&#8217;t fully enumerate complex trees.</p>
<p>In ESTreeNode.m:</p>
<p>- (NSArray *)descendants;<br />
{<br />
	NSMutableArray *array = [NSMutableArray array];<br />
	for (ESTreeNode *child in self.children) {<br />
		[array addObject:child];<br />
		if (![[child isLeaf] boolValue])<br />
			[array addObjectsFromArray:[child descendants]];<br />
	}<br />
	return [[array copy] autorelease];<br />
}</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Bill Monk</title>
		<link>http://espresso-served-here.com/2008/05/13/nstreecontroller-and-core-data-sorted/#comment-1064</link>
		<dc:creator>Bill Monk</dc:creator>
		<pubDate>Mon, 06 Oct 2008 19:57:53 +0000</pubDate>
		<guid isPermaLink="false">http://jonathandann.wordpress.com/?p=49#comment-1064</guid>
		<description>Nice article. 

Small bug in NSTreeController_Extensions.m: the -flattenedContent method throws a valueForUndefinedKey exception, "the entity Group is not key value coding-compliant for the key descendants."

The trouble is a mere copy/paste error, -flattenedNodes and -flattenedContent are very similar, and both do 

[node valueForKey:@"descendants"]. 

However -flattenedContent is working with ESTreeNodes, not NSTreeNodes. The  descendants key works in -flattenedNodes (calling your -descendants  category on NSTreeNode), but clearly @"children" was intended here, to call ESTreeNode's -children method. 

That is, in -flattenedContent :

if (![[realNode valueForKey:[self leafKeyPath]] boolValue])
	[mutableArray addObjectsFromArray:[realNode valueForKey:@"children"]]; // &#60; -

This works fine.

-Bill

PS, dragging leaf objects and undoing seems to be working here - no problems.</description>
		<content:encoded><![CDATA[<p>Nice article. </p>
<p>Small bug in NSTreeController_Extensions.m: the -flattenedContent method throws a valueForUndefinedKey exception, &#8220;the entity Group is not key value coding-compliant for the key descendants.&#8221;</p>
<p>The trouble is a mere copy/paste error, -flattenedNodes and -flattenedContent are very similar, and both do </p>
<p>[node valueForKey:@"descendants"]. </p>
<p>However -flattenedContent is working with ESTreeNodes, not NSTreeNodes. The  descendants key works in -flattenedNodes (calling your -descendants  category on NSTreeNode), but clearly @&#8221;children&#8221; was intended here, to call ESTreeNode&#8217;s -children method. </p>
<p>That is, in -flattenedContent :</p>
<p>if (![[realNode valueForKey:[self leafKeyPath]] boolValue])<br />
	[mutableArray addObjectsFromArray:[realNode valueForKey:@"children"]]; // &lt; -</p>
<p>This works fine.</p>
<p>-Bill</p>
<p>PS, dragging leaf objects and undoing seems to be working here - no problems.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jonathan Dann</title>
		<link>http://espresso-served-here.com/2008/05/13/nstreecontroller-and-core-data-sorted/#comment-1063</link>
		<dc:creator>Jonathan Dann</dc:creator>
		<pubDate>Fri, 03 Oct 2008 16:50:41 +0000</pubDate>
		<guid isPermaLink="false">http://jonathandann.wordpress.com/?p=49#comment-1063</guid>
		<description>Hi Rob,

Sorry it's taken me a while to get back to you on this, I'm in a rather internet-less state at the moment!

Unfortunately I haven't been able to get undo working for it, and you're right that its goes haywire!  I think it would require some inventive creation of undo-groupings if it's possible to fit it into the undo architecture of Core Data at all.

In Scribbler, I've actually turned of the Core Data undo management and written my own for that parts that make sense.  The way I use this source list, for management of files and folders  like iPhoto does, it's not a requirement to make moving a node an undoable action, so I haven't pursued it.

Sorry I can't shed any more light on it, if you get somewhere with it, please let me know.

Jon</description>
		<content:encoded><![CDATA[<p>Hi Rob,</p>
<p>Sorry it&#8217;s taken me a while to get back to you on this, I&#8217;m in a rather internet-less state at the moment!</p>
<p>Unfortunately I haven&#8217;t been able to get undo working for it, and you&#8217;re right that its goes haywire!  I think it would require some inventive creation of undo-groupings if it&#8217;s possible to fit it into the undo architecture of Core Data at all.</p>
<p>In Scribbler, I&#8217;ve actually turned of the Core Data undo management and written my own for that parts that make sense.  The way I use this source list, for management of files and folders  like iPhoto does, it&#8217;s not a requirement to make moving a node an undoable action, so I haven&#8217;t pursued it.</p>
<p>Sorry I can&#8217;t shed any more light on it, if you get somewhere with it, please let me know.</p>
<p>Jon</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Rob</title>
		<link>http://espresso-served-here.com/2008/05/13/nstreecontroller-and-core-data-sorted/#comment-1062</link>
		<dc:creator>Rob</dc:creator>
		<pubDate>Wed, 01 Oct 2008 20:18:55 +0000</pubDate>
		<guid isPermaLink="false">http://jonathandann.wordpress.com/?p=49#comment-1062</guid>
		<description>Jonathan,

Nice example app very helpful, was wondering if you where able to do the same thing but with undo working it, right now if you drag and drop a leaf from one place to another and hit undo the results from the undo are very random.

Rob</description>
		<content:encoded><![CDATA[<p>Jonathan,</p>
<p>Nice example app very helpful, was wondering if you where able to do the same thing but with undo working it, right now if you drag and drop a leaf from one place to another and hit undo the results from the undo are very random.</p>
<p>Rob</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jonathan Dann</title>
		<link>http://espresso-served-here.com/2008/05/13/nstreecontroller-and-core-data-sorted/#comment-1024</link>
		<dc:creator>Jonathan Dann</dc:creator>
		<pubDate>Thu, 26 Jun 2008 22:52:21 +0000</pubDate>
		<guid isPermaLink="false">http://jonathandann.wordpress.com/?p=49#comment-1024</guid>
		<description>Do you want to have an app that has many windows that can show the user their data but in different ways?  Like the way iTunes does when you double-click a playlist?  Can you be more specific with what you're trying to achieve in terms of using the program?</description>
		<content:encoded><![CDATA[<p>Do you want to have an app that has many windows that can show the user their data but in different ways?  Like the way iTunes does when you double-click a playlist?  Can you be more specific with what you&#8217;re trying to achieve in terms of using the program?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: MDK</title>
		<link>http://espresso-served-here.com/2008/05/13/nstreecontroller-and-core-data-sorted/#comment-1023</link>
		<dc:creator>MDK</dc:creator>
		<pubDate>Thu, 26 Jun 2008 15:31:51 +0000</pubDate>
		<guid isPermaLink="false">http://jonathandann.wordpress.com/?p=49#comment-1023</guid>
		<description>Hey Jonathan, 

Would like to bug you again, not 100% related but since you mentioned NSPersistentDocument and core data in other posts...

I've got a core-data based app which is a non-document-based app (think iTunes, etc) yet I'd like to use the document-based machinery for it. In other words, I want to use NSPersistentDocument (ie. it's undo features) + XSControllers architecture except that I'd like the document to be hard-wired to only file on disk -- with no support for opening file types etc. 

Is there some smart way to do this without changing Info.plist? Would you recommend this approach? Perhaps instantiating the Document myself and calling/simulating the makeWindowControllers machinery myself?</description>
		<content:encoded><![CDATA[<p>Hey Jonathan, </p>
<p>Would like to bug you again, not 100% related but since you mentioned NSPersistentDocument and core data in other posts&#8230;</p>
<p>I&#8217;ve got a core-data based app which is a non-document-based app (think iTunes, etc) yet I&#8217;d like to use the document-based machinery for it. In other words, I want to use NSPersistentDocument (ie. it&#8217;s undo features) + XSControllers architecture except that I&#8217;d like the document to be hard-wired to only file on disk &#8212; with no support for opening file types etc. </p>
<p>Is there some smart way to do this without changing Info.plist? Would you recommend this approach? Perhaps instantiating the Document myself and calling/simulating the makeWindowControllers machinery myself?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Issi</title>
		<link>http://espresso-served-here.com/2008/05/13/nstreecontroller-and-core-data-sorted/#comment-1022</link>
		<dc:creator>Issi</dc:creator>
		<pubDate>Sat, 21 Jun 2008 22:27:22 +0000</pubDate>
		<guid isPermaLink="false">http://jonathandann.wordpress.com/?p=49#comment-1022</guid>
		<description>Thanks for the post. Very informative and thought provoking.</description>
		<content:encoded><![CDATA[<p>Thanks for the post. Very informative and thought provoking.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Daniel</title>
		<link>http://espresso-served-here.com/2008/05/13/nstreecontroller-and-core-data-sorted/#comment-1021</link>
		<dc:creator>Daniel</dc:creator>
		<pubDate>Wed, 18 Jun 2008 20:23:57 +0000</pubDate>
		<guid isPermaLink="false">http://jonathandann.wordpress.com/?p=49#comment-1021</guid>
		<description>"Before then you can create a new project with the same name and drag in all the files (including the NIB and info.plist) into Xcode after deleting the originals. That should do it."

Tried that. No luck. It just hangs. I there's an incompatibility with the version of IB you're using and the official version 3.0. You used an unreleased beta so I expect there are some differences in the format of the XIB.</description>
		<content:encoded><![CDATA[<p>&#8220;Before then you can create a new project with the same name and drag in all the files (including the NIB and info.plist) into Xcode after deleting the originals. That should do it.&#8221;</p>
<p>Tried that. No luck. It just hangs. I there&#8217;s an incompatibility with the version of IB you&#8217;re using and the official version 3.0. You used an unreleased beta so I expect there are some differences in the format of the XIB.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
