Пункт меню для «About MyApp» был автоматически создан для меня и отображает окно «about».
Это стандартно для шаблонов Xcode для приложений Какао.Продолжайте читать, чтобы увидеть, как это связано.
Как мне отредактировать это окно?Я хотел бы добавить кое-что еще, но я нигде не могу найти xib.
xib отсутствует. Это окно создается во время выполнения объектом приложения ([NSApplication sharedApplication]
),когда он получает сообщение orderFrontStandardAboutPanelWithOptions:
, которое этот пункт меню отправляет при выборе (как вы проверяете в Инспекторе соединений в Интерфейсном Разработчике).
По умолчанию (как уже упоминали другие), он загружает содержимое вотображать из файла с именем «Credits.rtf», если такой файл существует в ресурсах вашего пакета приложений;в противном случае он получает базовую информацию из записей Info.plist вашего приложения:
- Имя приложения
- Версия пакета
- Уведомление об авторских правах
ЧтоВы можете переопределить это поведение следующим образом:
- Создайте собственное окно «О программе» в Интерфейсном конструкторе со всеми необходимыми подпредставлениями и метками, которые вы хотите.Назовите файл «AboutWindow.xib».
Создайте пользовательский подкласс NSWindowController
, инициализированный именем пера вашего пользовательского окна и назначенный владельцем пера:
- (instancetype) init {
if(self = [super initWithWindowNibName:@"AboutWindow" owner:self]){
// (other initialization...)
}
return self;
}
Подключите подпредставления окна «О» к выходам в классе контроллера окна.Кроме того, укажите класс для владельца файла в качестве пользовательского подкласса NSWindowController и подключите окно «Новый источник ссылок» к свойству window
владельца файла.
- Перейдите в файл MainMenu.xib в Интерфейсном Разработчике.Удалите действие, привязанное к пункту меню «О программе», и заново подключите новое к методу
about:
объекта-заполнителя «Первый ответчик». В вашемделегат приложения, добавьте переменную экземпляра для хранения вашего оконного контроллера, чтобы он не был освобожден сразу (альтернативно, сделайте ваш класс оконного контроллера одноэлементным и используйте экземпляр общего ресурса):
@implementation AppDelegate {
AboutWindowController *_aboutwindowController;
}
Все еще в AppDelegate, реализуйте метод about:
, который вы подключили на шаге 3, например:
- (IBAction)about:(id)sender {
if (_aboutwindowController == nil) {
_aboutwindowController = [AboutWindowController new];
}
[_aboutwindowController.window orderFront:self];
}
... или, если ваш контроллер представления реализован как одноэлементный, например так:
- (IBAction)about:(id)sender {
[[AboutWindowController defaultController].window orderFront:self];
}
Наконец, для того, чтобы ваш оконный контроллер правильно отображал информацию вашего приложения, прочитайте соответствующие ключи из файла Info.plist, например, так (фактический выходной ивар будет отличаться вваш случай):
- (void)windowDidLoad {
[super windowDidLoad];
// Implement this method to handle any initialization after your window
// controller's window has been loaded from its nib file.
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
self.appNameLabel.stringValue = [infoDictionary objectForKey:@"CFBundleName"];
self.appVersionLabel.stringValue = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
self.appCopyrightLabel.stringValue = [infoDictionary objectForKey:@"NSHumanReadableCopyright"];
}
У вас может возникнуть соблазн прочитать значок приложения и в комплекте ресурсов, но есть более элегантный способ, который работает, даже если вы не указалии застряли со стандартным значком приложения «Линейка + карандаш + кисть на листе»: возьмите изображение значка среды выполнения, используя следующий код:
self.appIconImageView.image = [NSApp applicationIconImage];
Я собрал демонстрационный проект наGithub , который показывает эту и другие настройки окна About.
ОБНОВЛЕНИЕ: Я добавил Swift версию демонстрации проект в хранилище Github.
Он имеет:
- Swift 4 (теперь, когда Xcode 9 официально)
- Раскадровки вместо xibs
- Перемещены все выходыновый контроллер view , сохранил код появления окна в контроллере window .