2010-08-08 12 views
10

में एप्लिकेशन मेनू कैसे प्राप्त कर सकता हूं मैं एप्लिकेशन मेनू के लिए NSMenu या NSMenuItem कैसे प्राप्त कर सकता हूं (सेब मेनू के बगल में मेनू बार में से एक)। ऐसा लगता है कि एनएसपीएनयू I से स्वचालित रूप से बनाया और स्वतंत्र एनएसपीप्लिकेशन सेटमेनमेनू के माध्यम से सेट किया गया है।मैं कोको

वैसे: मैं एक्सकोड के बिना अपना पूरा आवेदन बना रहा हूं, इसलिए कोई इंटरफेसबिल्डर सुझाव नहीं है।

पुनश्च: MacOSX 10.5

उत्तर

17

आईबी के बिना, आप NSApplication के mainmenu का उपयोग कर मेनू का उपयोग कर सकते हैं:

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

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

नहीं यह काम नहीं करता है। NSMenu में संख्याऑफइटम्स मुझे 1 देता है जब मैं मेनूबार में "टेस्टमेनू फ़ाइल" आइटम को स्पष्ट रूप से देखता हूं। – Lothar

+0

आह, मैंने आपकी परियोजना संरचना के बारे में एक धारणा व्यक्त की है। क्या आपने एक्सकोड में प्रोजेक्ट बनाया है और फिर nib/xib को पूरी तरह से हटा दिया है? या आप पूरी तरह से खरोंच से जा रहे हैं? यह ब्लॉग एंट्री मुख्य मेन्यू के साथ आप क्या अनुभव कर रहे हैं और एप्लिकेशन मेनू प्राप्त करने के लिए इस तरह से अपनी परियोजना को कैसे काम कर सकते हैं इसके बारे में बात करते हैं: http://lapcatsoftware.com/blog/2007/05/16/working -without-a-nib-part-1/ –

+0

धन्यवाद यह है। और हां, मैं पूरी तरह से निर्बाध हूं, वास्तव में विकास के दौरान मैं एक सामान्य ईएलएफ a.out कार्यक्रम के रूप में भी एक बंडल संरचना के बिना चलाता हूं। यह मेनू के लिए ठीक से बाहर काम करता है। – Lothar

0

Xcode या आईबी के बिना एक कोको अनुप्रयोग बनाना मेरे लिए masochistic लगता है, लेकिन प्रत्येक अपने ही है ... इसे आज़माएं: [[[NSApp mainMenu] itemAtIndex: 0] submenu]

+0

वैसे मैं एक भाषा बाध्यकारी लिख रहा हूं और मंच पोर्टेबल रहना चाहता हूं। लेकिन आपका समाधान काम नहीं करता है। बंडल नाम वाला मेनू आइटम जो स्वत: उत्पन्न होता है वह मेनमेनू का हिस्सा नहीं है। – Lothar

+0

यह मेरे लिए काम करता था, लेकिन मैंने इसे एक्सकोड और आईबी के साथ एक सामान्य ऐप में करने की कोशिश की। – JWWalker

+0

क्या यह संभव है कि आपने ऐप स्टार्टअप प्रक्रिया में बहुत जल्दी कोशिश की? मैंने इसे 'applicationDidFinishLaunching:' प्रतिनिधि विधि में करने की कोशिश की। – JWWalker

11

हालांकि इस 5 वर्ष सवाल यह है कि ... मैं इसे कैसे बनाने के लिए साझा करना चाहते।

एक्सकोड 7.1 के साथ ओएस एक्स 10.11 (एल कैपिटन) में अपने अनुभव में, उस एप्लिकेशन मेनू को दोहराना मुश्किल नहीं है। ऐसा लगता है कि ऐप्पल ने सभी अजीब सीमाओं को हटा दिया है।

नोट: यह कोड स्विफ्ट 3 के लिए अपडेट किया गया है, और केवल मैकोज सिएरा (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 डाउनलोड कर सकते हैं।