2012-01-05 12 views
6

मेरे पास एक एनएसएमएनयूइटम है जिसमें वस्तुओं का एक गुच्छा है, हालांकि ... सूची बस सक्षम नहीं होती है।NSMenuItem आइटम सक्षम करें

मैं क्या मतलब:
List

यह मेरा कोड है:

- (void)didFetchNewList:(NSArray *)list 
{ 
    NSArray *smallList = [list subarrayWithRange:NSMakeRange(0, 10)]; 

    NSMenu *menu = [[NSMenu alloc] initWithTitle:@""]; 

    for (NSDictionary *dict in smallList) 
    { 
     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
     [dateFormatter setDateFormat:@"MMM dd @ HH:mm:ss"]; 

     NSMenuItem *soMenuItem = [[NSMenuItem alloc] initWithTitle: 
        [dateFormatter stringFromDate:[dict objectForKey:@"date"]] 
                  action:nil 
                keyEquivalent:@""]; 
     [soMenuItem setEnabled:YES]; 

     [menu addItem:soMenuItem];   
    } 

    [menu addItem:[NSMenuItem separatorItem]]; 

    NSMenuItem *soMenuItem = [[NSMenuItem alloc] 
        initWithTitle:@"Settings" action:nil keyEquivalent:@"S"]; 
    [soMenuItem setEnabled:YES]; 
    [menu addItem:soMenuItem]; 

    [statusItem setMenu:menu]; 
    [statusItem setEnabled:YES]; 

} 

मैं सब कुछ सक्षम के रूप में स्थापित करने हूँ, फिर भी यह अभी भी अक्षम है। इसे कैसे हल किया जा सकता है?

उत्तर

12

जब आप NSMenuItem बनाते हैं तो आपके आइटम के पास एक वैध लक्ष्य और वैध चयनकर्ता होना चाहिए। इसका मतलब है कि लक्ष्य शून्य नहीं हो सकता है, और पास किए गए चयनकर्ता को जवाब देना है। ध्यान रखें कि इस मामले में एक नल चयनकर्ता मेनू आइटम को सक्षम नहीं करेगा।

NSMenu *myMenu; 
NSMenuItem *myItem; 

myMenu = [[NSMenu alloc] initWithTitle:@""]; 
myItem = [[NSMenuItem alloc] initWithTitle:@"Test" action:@selector(validSelector:) keyEquivalent:@""]; 
[myItem setTarget:myTarget]; 
[myMenu addItem:myItem]; 
// Do anything you like 
[myMenu release]; 
[myItem release]; 

संपादित करें: मैंने देखा कि आप YES साथ -[NSMenuItem setEnabled:] कॉल कर रहे हैं आप मेनू आइटम बनाने के बाद। यह आवश्यक नहीं है, क्योंकि वे डिफ़ॉल्ट रूप से सक्षम होंगे।

संपादित करें 2: जैसा कि एनएसजीओडी ने बताया (नीचे टिप्पणी देखें) लक्ष्य शून्य हो सकता है। उस स्थिति में आपके आवेदन के पहले उत्तरदाता को पास की विधि प्राप्त होगी। यही है, जब तक कि पहले उत्तरदाता ने उस विधि को लागू किया हो। (संपादित करें 3) हालांकि यदि यह मामला नहीं है, तो विधि उत्तरदाता श्रृंखला में अगले उत्तरदाता को भेजी जाएगी। यह तब तक जारी रहता है जब तक कोई उत्तरदाता नहीं पाया जाता है कि चयनकर्ता को जवाब देता है या कोई प्रतिक्रिया देने वाले को जांचने के लिए छोड़ दिया जाता है। जब कोई उत्तरदाता नहीं मिलता है तो आप मेनू आइटम सक्षम नहीं होंगे।

+4

जबकि मेनू आइटमों के पास वैध चयनकर्ता की आवश्यकता होती है, उनके पास एक लक्ष्य होना आवश्यक नहीं है (दूसरे शब्दों में, लक्ष्य ** ** 'शून्य हो सकता है)। एक 'शून्य' लक्ष्य का अर्थ है "उत्तरदाता श्रृंखला में पहली वस्तु का उपयोग करें जो मेरे चयनकर्ता को जवाब देता है"। यह मेनू आइटम के लक्ष्य को nib फ़ाइल में 'प्रथम प्रतिक्रिया' प्रॉक्सी ऑब्जेक्ट में सेट करने के लिए कार्यात्मक रूप से बराबर है। (Http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MenuList/Articles/EnablingMenuItems.html#//apple_ref/doc/uid/20000261-74653-BAJBGJHB) – NSGod

+0

आहा देखें! मैं पहले से ही सोच रहा था कि क्यों प्रारंभिक विधि में लक्ष्य तर्क नहीं है। इसे साफ करने के लिए धन्यवाद! – v1Axvw

+3

आपका दूसरा संपादन अभी भी बिल्कुल सही नहीं है: पहले उत्तरदाता को एक्शन संदेश प्राप्त होगा, लेकिन इसे लागू करने की आवश्यकता नहीं है। यदि ऐसा नहीं होता है, तो यह संदेश को इसके अगले उत्तरदाता को अग्रेषित करेगा। यह काम पर प्रतिक्रियाकर्ता श्रृंखला है। –

संबंधित मुद्दे