2013-02-25 3 views
2

У меня есть подкласс NSDocument, что происходит сбой всякий раз, когда я использую [само близко], чтобы избежать дефолта «Сохранить» диалогового окна для новых документов:Правильный способ закрыть NSDocument программно

2013-02-25 15:23:06.338 MyApp[692:403] An uncaught exception was raised 
2013-02-25 15:23:06.338 MyApp[692:403] NSWindow: -_newFirstResponderAfterResigining is not a valid message outside of a responder's implementation of -resignFirstResponder. 
2013-02-25 15:23:06.356 MyApp[692:403] (
0 CoreFoundation      0x00007fff8b2cdf56 __exceptionPreprocess + 198 
1 libobjc.A.dylib      0x00007fff88c00d5e objc_exception_throw + 43 
2 CoreFoundation      0x00007fff8b2cdd8a +[NSException raise:format:arguments:] + 106 
3 CoreFoundation      0x00007fff8b2cdd14 +[NSException raise:format:] + 116 
4 AppKit        0x00007fff858e0c34 -[NSWindow _newFirstResponderAfterResigning] + 164 
5 AppKit        0x00007fff85882c8a -[NSTextView(NSSharing) resignFirstResponder] + 54 
6 AppKit        0x00007fff8536dd79 -[NSWindow makeFirstResponder:] + 429 
7 AppKit        0x00007fff85488dfb -[NSWindow dealloc] + 802 
8 AppKit        0x00007fff8528b955 -[NSWindow release] + 535 
9 AppKit        0x00007fff858b541c __destroy_helper_block_4 + 26 
10 libsystem_blocks.dylib    0x00007fff8702b174 _Block_release + 181 
11 libdispatch.dylib     0x00007fff84ab28f2 _dispatch_main_queue_callback_4CF + 308 
12 CoreFoundation      0x00007fff8b262e7c __CFRunLoopRun + 1724 
13 CoreFoundation      0x00007fff8b262486 CFRunLoopRunSpecific + 230 
14 HIToolbox       0x00007fff8d64e2bf RunCurrentEventLoopInMode + 277 
15 HIToolbox       0x00007fff8d65556d ReceiveNextEventCommon + 355 
16 HIToolbox       0x00007fff8d6553fa BlockUntilNextEventMatchingListInMode + 62 
17 AppKit        0x00007fff85252779 _DPSNextEvent + 659 
18 AppKit        0x00007fff8525207d -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 135 
19 AppKit        0x00007fff8524e9b9 -[NSApplication run] + 470 
20 AppKit        0x00007fff854caeac NSApplicationMain + 867 
21 MyApp        0x00000001059098d2 main + 34 
22 MyApp        0x00000001059098a4 start + 52 
23 ???         0x0000000000000003 0x0 + 3 
) 

Кто-нибудь видел это раньше или может кто предлагает лучший/правильный способ закрыть NSDocument без отображения диалогового окна сохранения?

+0

Могу ли я спросить, почему вы пытаетесь закрыть документ прямо здесь? Могу предложить некоторые идеи относительно альтернативных маршрутов, а не прямо атаковать этот crasher –

+0

Привет, Майк. Документы представляют записи в блогах. Пользователь открывает документ и сохраняет его локально или отправляет на сервер. В большинстве случаев, когда они публикуются без сохранения, они не хотят, чтобы их попросили сохранить при закрытии документа, они предпочли бы, чтобы документ просто ушел. Не очень большое дело, но это небольшая точка трения, о которой меня спрашивали некоторые пользователи. – diego

ответ

2

Итак, судя по вашим последующим комментариям, вы пытаетесь сделать подавление стандартного закрывающего листа подтверждения при определенных обстоятельствах. Некоторые способы сделать это:

  • Принять автосохранение на месте, которое движется от древней парадигмы вручную сохранения документов
  • Override -[NSDocument canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo:] так говорит делегат «да, вы можете закрыть», а не представляя лист
  • После того, как запись производится по телефону [document updateChangeCount: NSChangeCleared] сообщить документ, который вы считаете, что для сохранения
+0

У меня уже есть автосохранение на месте, поэтому я дам второе и третье предложения. Благодарю. – diego

+0

А, это хороший момент. Даже при автосохранении на месте, если пользователь закрывает документ, который * никогда не был сохранен, ОС все еще бросает лист об этом. Так что да, вам нужен один из других вариантов :-) –

+0

Похоже, 'updateChangeCount:' делает трюк. Благодаря! – diego

Смежные вопросы