#objective-c #xcode #macos #cocoa #printing
#objective-c #xcode #macos #cocoa #печать
Вопрос:
Я новичок в печати на какао и пытаюсь понять, как воспользоваться встроенной NSView
печатью. Я не писал никакого кода и ничего не делал в IB для включения печати, поэтому я просто получил базовую функциональность, встроенную во все окна cocoa.
Моя проблема в том, что если один из NSTextField
символов в окне имеет фокус, когда я нажимаю Cmd-P для печати, он пытается напечатать только это текстовое поле. Я бы хотел, чтобы это текстовое поле игнорировало запрос на печать, чтобы он просачивался до окна. У меня также есть NSTableView
, и я бы хотел, чтобы с этим произошло то же самое. Если в нем выбрана строка, я бы хотел NSTableView
, чтобы запрос на печать игнорировался, поэтому, как и текстовое поле, оно в конечном итоге будет передано вверх в окно (или в NSView
представление содержимого окна).
Помогите?
Ответ №1:
Вы можете изменить, какой метод Print…
настроен для вызова элемента меню в вашем основном файле nib. По умолчанию он настроен на вызов -print:
первого ответчика. В случае текстового поля с фокусом оно будет вызывать print:
это, а это не то, что вам хотелось бы.
Вместо этого вы могли бы определить метод, например, -printWindow:
в вашем основном классе контроллера. Затем измените пункт меню Печать … -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: цепочка ответчиков.
Комментарии:
1. Спасибо за ответ. Я изменил пункт меню печати, чтобы запустить селектор PrintWindow: вместо print:. Я определил метод -PrintWindow: на моем основном оконном контроллере, и он работает просто отлично. Однако у меня есть дополнительное окно, и меню печати отключено, когда это окно имеет фокус … хотя я также определил PrintWindow: на моем дополнительном оконном контроллере. Включена автоматическая проверка пунктов меню, есть идеи, почему печать отключена в моем втором окне?
2. Блестяще! Вот и все, у меня не было делегата окна, подключенного к владельцу файла. Спасибо!