2011-08-21 3 views
3

В моей основе приложении NSDocument, мои документы должны быть связаны с каталогами (они индекс каталога)Как я могу открыть открытые папки на основе NSDocument, но сохранить связанные документы в поддержку приложений?

Я хочу, чтобы иметь возможность открывать/сохранять документы в соответствии со следующим прецедентом:

  1. Открытие каталога: a) если в папке есть файл .myapp, откройте его b) иначе посмотрите, есть ли файл HASH-OF-PATH-basename.myapp в ~/Library/Application Support/MyApp и откройте это b) иначе создайте новый документ в памяти

  2. Открытие файла xxx.myapp, как нормальный

  3. Сохранить/автосохранения а) если источник тока Дока 1b, 1c, или 2 сохранить файл в ~/Library/Application Support/MyApp/HASH-зача- PATH-basename.myapp б) если источник тока документ был 1а, сохранить этот файл .myapp

  4. Save As/сохранить в б) сохранить xxxxx.myapp туда, где пользователь указывает

Очевидным было бы просто реализовать readFromURL : ofType: error: L и writeToURL: ofType: forSaveOperation: originalContentsURL: ошибка: и URL-адрес переключателя по мере необходимости, основываясь на том, что было сделано с сохранением.

Это работает с тем, что я могу открывать файлы и папки, а когда я сохраняю открытую папку, мой файл сохраняется в Application Support, но затем после writeToURL: ofType: forSaveOperation: originalContentsURL: ошибка возникает ошибка и отображается диалоговое окно со следующей погрешностью:

NSDocument could not delete the temporary item at 
file://localhost/private/var/folders/6P/6PNpIB-6HreGE+Ikqf5dWU+++TI/ 
-Tmp-/TemporaryItems/(A%20Document%20Being%20Saved%20By%20MyApp%203) 
/SomeDirectory. 
Here's the error: 
Error Domain=NSCocoaErrorDomain Code=4 UserInfo=0x200583a00 
"“SomeDirectory” couldn’t be removed." 
+0

+1 потому что NSDocument - странный зверь :) – jtbandes

+0

было странно, но я думаю, что какао что-то делает между saveToURL и writeToURL. Может быть, это связано с экономией атомного или «безопасного»? Интересно, потеряете ли вы это при переопределении writeTOURL? –

ответ

1

Это оказалось довольно легко решить.

I overrode saveToURL: ofType: forSaveOperation: ошибка: и сделал url & тип swapping на основе типа SaveOperation.

Теперь все работает должным образом.