2010-12-17 14 views
5

मुझे यह अजीब व्यवहार मिल रहा है। मैं उपयोगकर्ता को दिखाने के लिए पाठ के साथ एक पैनल का उपयोग कर रहा हूं जब ऐप कुछ जानकारी के लिए इंतजार कर रहा है। उपयोगकर्ता को कुछ क्लिक करने से रोकने के लिए यह पैनल सामान्य रूप से दिखाया गया है।NSToolBar सत्यापन को कैसे बल दें?

जब लोडिंग पैनल छुपाया जाता है तो टूलबार पर सभी आइटम अक्षम होते हैं और validateToolbarItem विधि नहीं कहा जाता है।

- (void)showInWindow:(NSWindow *)mainWindow { 
sheetWindow = [self window]; 
[self sheetWillShow]; 

[NSApp beginSheet:sheetWindow modalForWindow:mainWindow modalDelegate:nil didEndSelector:nil contextInfo:nil]; 
[NSApp runModalForWindow:sheetWindow]; 
[NSApp endSheet:sheetWindow]; 
[sheetWindow orderOut:self]; 
} 

- (void)dismissModal { 
[sheetWindow close]; 
[NSApp stopModal]; 
} 

मैं कैसे इस मामले में मान्य करने के लिए उपकरण पट्टी के लिए मजबूर कर सकते हैं:

मैं इस तरह से पैनल दिखा रहा हूँ? टिप्पणी के बाद

संपादित करें:

मैं पहले से ही की कोशिश की है:

  • [[[NSApp mainWindow] toolbar] validateVisibleItems]
  • [[NSApp mainWindow] update];
  • [NSApp updateWindows];
  • [NSApp setWindowsNeedUpdate:YES];

कॉल के बाद सभी dismissModal। मैं सोच रहा हूँ कि समस्या कहीं और है ....

उत्तर

3
NSToolbar *toolbar; //Get this somewhere. If you have the window it is in, call [window toolbar]; 
[toolbar validateVisibleItems]; 
+0

शीर्षलेख से: आमतौर पर आपको इस विधि का आह्वान नहीं करना चाहिए। प्रत्येक दृश्यमान आइटम को मान्य करने के उद्देश्य से विंडो अपडेट पर इस विधि को कॉल किया जाता है। –

6

समस्या NSToolbar केवल NSToolbarItem की कि छवि प्रकार है, जो मेरा कोई भी थे के हैं करने के लिए सत्यापन संदेश भेजता है। किसी भी या सभी NSToolbarItems को सत्यापित करने के लिए, NSToolBar का एक कस्टम उप-वर्ग बनाएं और मान्य VISibleItems: विधि को ओवरराइड करें। यह सभी दृश्य NSToolbarItem के लिए सत्यापन संदेश भेजेगा। एकमात्र असली अंतर यह है कि टूलबार वर्ग को वापस लौटने वाले आइटम को सक्षम या अक्षम करने के बजाय, आपको सत्यापन विधि में आइटम को सक्षम या अक्षम करने की आवश्यकता है।

@interface CustomToolbar : NSToolbar 
@end 
@implementation CustomToolbar 
-(void)validateVisibleItems 
{ 
    for (NSToolbarItem *toolbarItem in self.visibleItems) 
    { 
     NSResponder *responder = toolbarItem.view; 
     while ((responder = [responder nextResponder])) 
     { 
      if ([responder respondsToSelector:toolbarItem.action]) 
      { 
       [responder performSelector:@selector(validateToolbarItem:) withObject:toolbarItem]; 
      } 
     } 
    } 
} 
@end 

अब, मान लें कि एक IBAction विधि है कि अपनी उपकरण पट्टी में एक NSSegmentedControl के कार्रवाई संभालती के साथ एक नियंत्रक है:

- (IBAction)backButton:(NSSegmentedControl*)sender 
{ 
    NSInteger segment = sender.selectedSegment; 
    if (segment == 0) 
    { 
     // Action for first button segment 
    } 
    else if (segment == 1) 
    { 
     // Action for second button segment 
    } 
} 

प्लेस एक ही नियंत्रक कि उपकरण पट्टी आइटम की कार्रवाई संभालती में निम्नलिखित:

-(BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem 
{ 
    SEL theAction = [toolbarItem action]; 
    if (theAction == @selector(backButton:)) 
    { 
     [toolbarItem setEnabled:YES]; 

     NSSegmentedControl *backToolbarButton = (NSSegmentedControl *)toolbarItem.view; 
     [backToolbarButton setEnabled:YES forSegment:0]; 
     [backToolbarButton setEnabled:NO forSegment:1]; 
    } 
    return NO; 
} 

परिणाम यह है कि आपके पास पूर्ण नियंत्रण है कि कौन से सेगमेंट सक्षम या अक्षम हैं।

यह तकनीक लगभग किसी अन्य प्रकार के एनएसटीूलबार इटिम पर लागू होनी चाहिए जब तक कि आइटम की प्राप्त कार्रवाई को उत्तरदाता श्रृंखला में नियंत्रक द्वारा संभाला जा रहा हो।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

आपके उत्तर के लिए धन्यवाद! यह आशाजनक प्रतीत होता है :) जैसा कि आप देखते हैं कि यह सवाल काफी पुराना है। मैं अब किसी भी ओएसएक्स प्रोजेक्ट में काम नहीं कर रहा हूं इसलिए यदि कोई है (आपके अलावा) जो आपके उत्तर को सत्यापित कर सकता है तो मैं इसे सही के रूप में चिह्नित करूंगा। धन्यवाद –

+0

धन्यवाद।मुझे लगता है कि इस तरह के एक पुराने सवाल का जवाब देने में कुछ अजीब लग रहा था, लेकिन मैंने समाधान की खोज करने के लिए बहुत प्रयास किए और आखिर में कई अवधारणाओं को एक साथ जोड़कर जो कि एक बड़ी कड़वाहट नहीं थी, मैंने सोचा कि इसे साझा करना एक अच्छा विचार होगा। मुझे पता है कि यह काम करता है, लेकिन मैं वास्तव में जानना चाहता हूं कि कोई बेहतर समाधान है या यदि मैंने ऐसा कुछ किया जो उपयुक्त नहीं माना जाता है। –

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