2013-12-15 2 views
0

Это довольно странная проблема. У меня есть таблица в приложении Cocoa, которая отображает список недавно открытых файлов. Вы можете дважды щелкнуть по записи, чтобы открыть связанный файл. Однако проблема заключается в том, что после того, как файл открывается один раз, через панель «Открыть», «Недавние документы» или через вышеупомянутую таблицу, он не может быть снова открыт, пока приложение не завершит работу и не откроется. Другие документы, однако, могут быть открыты, но после их закрытия они также не могут быть открыты.Документ какао не откроется снова после его закрытия

Это довольно странное поведение, и я не уверен, что вызывает его. Но это, конечно, раздражает. Для справки, атрибут Release on Closed окна из Xcode ничего не делает и, если выбрано, ничего не делает. Я не могу думать о каких-либо других атрибутах, которые могут вызвать такое поведение. Для справки, вот фотография панели атрибутов:

A photo of the document window attributes panel.

Вот код для таблицы, которая открывает недавно открытый файл:

- (void)respondToRecentFileDoubleClick { 
    NSInteger clickedRow = [_recentFileBrowser clickedRow]; 

    if (clickedRow != -1) { // We're in the row. 
     NSDocumentController *docControl = [NSDocumentController sharedDocumentController]; 
     NSURL *selectedDocument = (NSURL *)[docControl recentDocumentURLs][clickedRow]; 
     NSLog(@"Selected row %ld.", (long)clickedRow); 
     [[NSDocumentController sharedDocumentController] openDocumentWithContentsOfURL:selectedDocument display:YES completionHandler:nil]; 
    } 
} 

Документация openDocumentWithContentsOfURL: говорит, что документ выиграл» t, если он уже открыт, но в этом случае все окна документа закрыты, поэтому это не может быть причиной такого поведения. И инструкция NSLog() внутри блока if печатает, поэтому я знаю, что код выполняется.

Кто-нибудь знает, что может вызвать эту странную проблему?

ответ

0

Из изображения Xcode выясняется, что вы используете свой собственный WindowController. Элемент меню закрытия по умолчанию подключается к вызову executeClose. Метод executeClose реализован в NSWindow. Итак, происходит то, что окно закрывается, но документ не удаляется из открытого списка документов. Попробуйте добавить < NSWindowDelegate> к вашему интерфейсу WindowController (в файле .h). Затем добавьте в свой WindowController файл .m:

- (void) windowWillClose:(NSNotification *)notification { 
[ourdoc close]; 
} 

Заменитель независимо от переменной вы используете, чтобы держать вашу ссылку на документ для ourdoc. Обычно метод setDocument будет вызван с вашей ссылкой на документ. (Также в вашем WindowController.)

- (void) setDocument:(NSDocument *)document { 
ourdoc = (yourNSDocumentsubclass *)document; 
} 

completionHandler: изменение ноль для отладки:

completionHandler:^(NSDocument *doc, BOOL documentWasAlreadyOpened, NSError *error) { 
    if (documentWasAlreadyOpened) { 
     NSLog(@"document was already opened"); 
     NSArray *rats = [[NSDocumentController sharedDocumentController] documents]; 
     NSLog(@"%s seriously: %@", __PRETTY_FUNCTION__, rats); 
    } 
} 
+0

Где доказательства того, что я использую свой собственный 'WindowController'? Класс «Мой документ» является подклассом «NSDocument», а «Владелец файла» - это этот класс Document, а не оконный контроллер. Я могу попробовать ваше предложение. – SevenBits

+0

@SevenBits - я сделал неправильное предположение о подклассе WindowController. Тем не менее, я считаю, что документ не закрывается. Для отладки вы могли бы поместить в свой обработчик завершения opendocument следующие строки: (см. Edit в ответе). – Bill

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