Создать приложение Cocoa без NSMenu

Я хотел бы создать приложение, которое выводит диалоги на основе системных событий. Однако это приложение не должно иметь связанного с ним NSMenu.

Что я пробовал, ничего из этого не сработало:

  • Удаление NSMenu из основной раскадровки, но это не позволяет мне удалить его.
  • Переопределение NSApplication и настройка меню на ноль.
  • Просмотр настроек Info.plist для настройки, которая позволяет моему приложению не иметь NSMenu.

Любая помощь будет оценена по достоинству.


person rein    schedule 28.01.2021    source источник
comment
Я предполагаю, что вы не хотите видеть название приложения в заголовке меню приложения.   -  person apodidae    schedule 29.01.2021
comment
Нет, я бы предпочел этого не делать.   -  person rein    schedule 29.01.2021
comment
Мне удалось добиться этого с помощью приложения, которое было создано моим собственным редактором, а не приложением, созданным с использованием Xcode. В info.plist я удалил поля «Исполняемый файл» и «Имя пакета» после того, как приложение было создано с использованием терминала (Clang) и моего редактора для создания системы папок пакета. С этой техникой могут быть долгосрочные последствия, о которых я не знаю, но это можно сделать.   -  person apodidae    schedule 29.01.2021
comment
Исправление: я использовал swiftc для создания приложения, а не Clang.   -  person apodidae    schedule 29.01.2021


Ответы (2)


/*
  Save this file with name 'delegate_noMenu.swift'
  Create executable in Terminal: swiftc delegate_noMenu.swift -o nm
*/

import Cocoa

class AppDelegate: NSObject, NSApplicationDelegate {
var window:NSWindow!
    
func buildWnd() {
    
let _wndW : CGFloat = 400
let _wndH : CGFloat = 300

 window = NSWindow(contentRect:NSMakeRect(0,0,_wndW,_wndH),styleMask:[.titled, .closable, .miniaturizable, .resizable], backing:.buffered, defer:false)
 window.center()
 window.title = "Swift Test Window"
 window.makeKeyAndOrderFront(window)
 }

func applicationDidFinishLaunching(_ notification: Notification) {
 buildWnd()
}

func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
 return true
}
}

let appDelegate = AppDelegate()

// **** main.swift **** //
let app = NSApplication.shared
app.delegate = appDelegate
app.setActivationPolicy(.regular)
app.activate(ignoringOtherApps:true)
app.run()

  1. Сохраните этот файл с именем «delegate_noMenu.swift».
  2. Создайте исполняемый файл в Терминале, используя: swiftc delegate_noMenu.swift -o nm
  3. Вручную создайте систему папок для создания пакета приложений: A. Создайте папку с именем «myApp». B. Внутри верхней папки создайте папку «Содержание». C. Внутри «Содержимого» создайте две папки с именами «MacOS» и «Ресурсы». D. Внутри папки «Содержание» также добавьте файл info.plist, соответствующий изображению ниже. Обратите внимание, что поля «Исполняемый файл» и «Имя пакета» остаются пустыми.
  4. Добавьте исполняемый файл «nm» в папку MacOS.
  5. Переименуйте папку «myApp» в «nm.app», что должно изменить значок и создать приложение, на которое можно щелкнуть дважды.
  6. Надеюсь, вы не увидите никаких пунктов меню в строке меню и у вас будет функциональное приложение. Я использовал MacOS 10.14.6.

app_noMenu

person apodidae    schedule 29.01.2021
comment
Спасибо за действительно длинную запись. Одно изменение, которое я должен был сделать: import Cocoa. Кроме этого, он полностью сделал окно и запустил его. Однако, запустив его в Big Sur, он по-прежнему изменяет строку меню, чтобы включить имя приложения. :( Ну что ж, вы просто легенда, что публикуете все это, и я научился создавать папку .app с нуля. Спасибо! - person rein; 30.01.2021
comment
Я только что протестировал его на Big Sur, и в моей системе он работает нормально; нет меню. У меня есть скриншот, но комитет цензуры не разрешает мне его опубликовать. - person apodidae; 30.01.2021
comment
Я нашел ответ на свой вопрос: Настройка Application is agent to YES в info.plist работает. - person rein; 31.01.2021

Нашла ответ на свой вопрос:

Установка Application is agent (UIElement) на YES в info.plist создает окно без создания строки меню. Это действие, которое я желал.

введите здесь описание изображения

person rein    schedule 31.01.2021