Я делаю несколько сумасшедших нескольких документов внутри одного окна с архитектурой на основе документов, и я делаю 95%.
У меня есть эта двухуровневая архитектура документа, где открывается родительский документ и настраивает окно, предоставляя список "дочерних" документов. Когда пользователь выбирает одного из дочерних элементов, этот документ открывается с одним и тем же контроллером окна, и он помещает NSTextView
в окно. Связь документа контроллера окон изменяется так, что "отредактированная точка" и заголовок окна отслеживают текущий выбранный документ. Подумайте о проекте Xcode и о том, что происходит, когда вы редактируете в нем разные файлы.
Чтобы поместить код в псевдоформу, метод, подобный этому, вызывается в родительском документе при открытии дочернего документа.
-(void)openChildDocumentWithURL:(NSURL *)documentURL {
// Don't open the same document multiple times
NSDocument *childDocument = [documentMapTable objectForKey:documentURL];
if (childDocument == nil) {
childDocument = [[[MyDocument alloc] init] autorelease];
// Use the same window controller
// (not as bad as it looks, AppKit swaps the window document association for us)
[childDocument addWindowController:myWindowController];
[childDocument readFromURL:documentURL ofType:@"Whatever" error:NULL];
// Cache the document
[documentMapTable setObject:childDocument forKey:documentURL];
}
// Make sure the window controller gets the document-association swapped if the doc came from our cache
[myWindowController setDocument:childDocument];
// Swap the text views in
NSTextView *currentTextView = myCurrentTextView;
NSTextView *newTextView = [childDocument textView];
[newTextView setFrame:[currentTextView frame]]; // Don't flicker
[splitView replaceSubview:currentTextView with:newTextView];
if (currentTextView != newTextView) {
[currentTextView release];
currentTextView = [newTextView retain];
}
}
Это работает, и я знаю, что оконный контроллер имеет правильную ассоциацию документов в любой момент времени, поскольку точка и заголовок изменения следуют независимо от того, какой документ я редактирую.
Однако, когда я нажимаю save (CMD + S или File → Save/Save As), он хочет сохранить родительский документ, а не текущий документ (как сообщается [[NSDocumentController sharedDocumentController] currentDocument]
и как указано в заголовке окна и измените точку).
Из чтения документации NSResponder
кажется, что цепочка должна быть такой:
Текущий вид → Superview (повтор) → Окно → WindowController → Документ → DocumentController → Приложение.
Я не уверен, как основанная на документе архитектура настраивает цепочку ответчиков (то есть, как она помещает NSDocument
и NSDocumentController
в цепочку), поэтому я хотел бы отлаживать ее, но я не уверен, где смотреть. Как получить доступ к цепочке ответчиков в любой момент времени?