2010-08-08 1 views
10

에서 응용 프로그램 메뉴를 얻을 수있는 방법. 그것은 자동으로 만들어지고 NSApplication setMainMenu를 통해 설정 한 NSMenu와는 독립적입니다. 그런데 내가 응용 프로그램 메뉴 (다음 Apple 메뉴에있는 메뉴 표시 줄에 하나)의 NSMenu 또는 NSMenuItem을 얻을 수있는 방법 내가 코코아

: 나는 엑스 코드없이 내 전체 응용 프로그램을 짓고 있어요, 그래서하시기 바랍니다 어떤 인터페이스 빌더 팁.

PS :에서라도 10.5

답변

17

IB없이, 당신은 NSApplication의에는 mainMenu를 사용하여 메뉴에 액세스 할 수 있습니다 :

NSMenu *mainMenu = [[NSApplication sharedApplication] mainMenu]; 
NSMenu *appMenu = [[mainMenu itemAtIndex:0] submenu]; 

for (NSMenuItem *item in [appMenu itemArray]) { 
    NSLog(@"%@", [item title]); 
} 
+0

아니요 작동하지 않습니다. NSMenu의 numberOfItems는 메뉴 모음의 "TestMenu File"항목을 명확하게 볼 때도 1을 표시합니다. – Lothar

+0

아, 나는 당신의 프로젝트 구조에 대한 가정을 한 것처럼 보입니다. Xcode에서 프로젝트를 만든 다음 nib/xib를 완전히 제거 했습니까? 아니면 완전히 처음부터 가고 있습니까? 이 블로그 항목은 mainMenu에서 겪고있는 것과 응용 프로그램 메뉴를 얻는 방법으로 프로젝트를 수행하는 방법에 대해 설명합니다. http://lapcatsoftware.com/blog/2007/05/16/working -with-a-nib-part-1/ –

+0

고마워요. 그리고 네, 사실 저는 개발 중에도 번들 구조가없는 일반 ELF a.out 프로그램으로 실행되기도합니다. 그것은 잘 execept 메뉴에 대한 작동합니다. – Lothar

0

엑스 코드 또는 IB없이 코코아 응용 프로그램을 만들기는 나에게 자학 들리지만, 각 자신에 ...이 시도 : [[[NSApp mainMenu] itemAtIndex: 0] submenu]합니다.

+0

글쎄, 나는 언어 바인딩을 쓰고있어 휴대용 플랫폼을 유지하고 싶다. 그러나 당신의 해결책은 효과가 없습니다. 번들 이름이 자동 생성 된 메뉴 항목은 mainMenu의 일부가 아닙니다. – Lothar

+0

저에게 도움이되었지만 Xcode와 IB가있는 일반 앱에서 사용 해보았습니다. – JWWalker

+0

앱 시작 프로세스에서 너무 일찍 시도했을 가능성이 있습니까? 나는'applicationDidFinishLaunching :'delegate 메소드에서 시도했다. – JWWalker

11

을이 5 세 질문이지만 ... 나는 그것을 만드는 방법을 공유하는 것을 좋아합니다.

Xcode 7.1이 설치된 OS X 10.11 (El Capitan)에서의 경험에 따르면, 해당 응용 프로그램 메뉴를 복제하기가 어렵지 않습니다. 애플이 이상한 한계를 모두 없앴다.

참고 :이 코드는 Swift 3 용으로 업데이트되었으며 macOS Sierra (10.12.1)에서만 테스트되었습니다.

// 
// AppDelegate.swift 
// Editor6MainMenuUI2Testdrive 
// 
// Created by Hoon H. on 2016/11/05. 
// Copyright © 2016 Eonil. All rights reserved. 
// 

import Cocoa 

/// You SHOULD NOT use `@NSApplicationMain` 
/// to make your custom menu to work. 
class AppDelegate: NSObject, NSApplicationDelegate { 
    func applicationDidFinishLaunching(_ aNotification: Notification) {} 
    func applicationWillTerminate(_ aNotification: Notification) {} 
} 

func makeMainMenu() -> NSMenu { 
    let mainMenu   = NSMenu() // `title` really doesn't matter. 
    let mainAppMenuItem  = NSMenuItem(title: "Application", action: nil, keyEquivalent: "") // `title` really doesn't matter. 
    let mainFileMenuItem = NSMenuItem(title: "File", action: nil, keyEquivalent: "") 
    mainMenu.addItem(mainAppMenuItem) 
    mainMenu.addItem(mainFileMenuItem) 

    let appMenu    = NSMenu() // `title` really doesn't matter. 
    mainAppMenuItem.submenu = appMenu 

    let appServicesMenu  = NSMenu() 
    NSApp.servicesMenu  = appServicesMenu 

    appMenu.addItem(withTitle: "About Me", action: nil, keyEquivalent: "") 
    appMenu.addItem(NSMenuItem.separator()) 
    appMenu.addItem(withTitle: "Preferences...", action: nil, keyEquivalent: ",") 
    appMenu.addItem(NSMenuItem.separator()) 
    appMenu.addItem(withTitle: "Hide Me", action: #selector(NSApplication.hide(_:)), keyEquivalent: "h") 
    appMenu.addItem({() -> NSMenuItem in 
     let m = NSMenuItem(title: "Hide Others", action: #selector(NSApplication.hideOtherApplications(_:)), keyEquivalent: "h") 
     m.keyEquivalentModifierMask = [.command, .option] 
     return m 
     }()) 
    appMenu.addItem(withTitle: "Show All", action: #selector(NSApplication.unhideAllApplications(_:)), keyEquivalent: "") 

    appMenu.addItem(NSMenuItem.separator()) 
    appMenu.addItem(withTitle: "Services", action: nil, keyEquivalent: "").submenu = appServicesMenu 
    appMenu.addItem(NSMenuItem.separator()) 
    appMenu.addItem(withTitle: "Quit Me", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q") 

    let fileMenu = NSMenu(title: "File") 
    mainFileMenuItem.submenu = fileMenu 
    fileMenu.addItem(withTitle: "New...", action: #selector(NSDocumentController.newDocument(_:)), keyEquivalent: "n") 

    return mainMenu 
} 

let del = AppDelegate() 
/// Setting main menu MUST be done before you setting app delegate. 
/// I don't know why. 
NSApplication.shared().mainMenu = makeMainMenu() 
NSApplication.shared().delegate = del 
NSApplication.shared().run() 

어쨌든 자동으로 생성되지 않으므로 모두 설정해야합니다. 나는 이것을 할 다른 방법이 있는지 없는지 잘 모르겠습니다.

당신은 예를 here 작업 다운로드 할 수 있습니다.