Вы можете изменить метод, который элемент меню Print…
настроен для вызова в вашем основном файле пера. По умолчанию он настроен на вызов -print:
первого респондента. В случае текстового поля, которое имеет фокус, оно будет вызывать print:
, а это не то, что вам нужно.
Вместо этого вы можете определить метод, такой как -printWindow:
, в своем классе основного контроллера. Затем измените пункт меню Print…, чтобы вызвать метод -printWindow:
первого респондента. Затем в этом методе вы можете отправить print:
в представление содержимого основного окна. Код будет выглядеть примерно так:
.h:
@interface MDAppController : NSObject <NSApplicationDelegate> {
IBOutlet NSWindow *window;
}
- (IBAction)printWindow:(id)sender;
@end
.m:
@implementation MDAppController
- (IBAction)printWindow:(id)sender {
NSLog(@"[%@ %@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
[[window contentView] print:sender];
}
@end
Пример проекта, который показывает это:
http://www.markdouma.com/developer/PrintWindow.zip
Что касается вашего комментария, он звучит так, как во втором контроллере окна / второго окна, контроллер второго окна отсутствует в цепочке респондента, а контроллер главного окна находится в цепочке респондента. Это может быть по разным причинам. Ваш главный оконный контроллер является делегатом приложения? Вы можете попробовать убедиться, что второй оконный контроллер настроен на delegate
своего окна. Надеюсь, это должно вставить оконный контроллер в цепочку респондента. В противном случае для получения дополнительной информации о цепочке респондента см. Руководство по обработке событий Cocoa: цепочка респондента .