2012-07-12 10 views
5

मेरे पास मुख्य ऐप मेनू के अंदर एक मेनू आइटम है और मैं अपनी क्रिया को एक व्यू कंट्रोलर (NSViewController) पर रूट करना चाहता हूं। इंटरफ़ेस पदानुक्रम इस तरह दिखता है: NSWindowController द्वारा एक मुख्य ऐप विंडो नियंत्रक है। खिड़की के अंदर एक अलग दृश्य है, और विभाजन दृश्य में सही दृश्य NSViewController द्वारा नियंत्रित किया जाता है।मैं मेनू क्रियाओं को एक विंडो के अंदर NSViewController पर कैसे रूट करूं?

Window + NSWindowController 
    `-- NSSplitView 
      `-- NSView 
      `-- NSView + NSViewController 

मेनू आइटम इंटरफ़ेस बिल्डर में प्रथम प्रतिक्रियाकर्ता से जुड़ा हुआ है। प्रश्न में दृश्य नियंत्रक उपयुक्त विधि लागू करता है, लेकिन मेनू आइटम अक्षम रहता है। जब मैं विधि को NSWindowController पर ले जाता हूं, तो मेनू आइटम सक्षम हो जाता है।

मुझे लगा कि मुझे प्रतिक्रिया नियंत्रक को दृश्य नियंत्रक प्राप्त करने की आवश्यकता है, इसलिए मैंने इसे विंडो नियंत्रक के लिए nextResponder के रूप में सेट किया है; कोई सिगार नहीं। मैं क्या गलत कर रहा हूं?

+0

आप अपने नियंत्रक का प्रतिनिधित्व करते हुए आईबी में एक वस्तु जोड़ सकते हैं। फिर मेनू नियंत्रक को अपने नियंत्रक के IBAction से लिंक करें। –

+0

दुर्भाग्यवश यह संभव नहीं है, दृश्य नियंत्रक बाएं स्प्लिट व्यू फलक में चुने गए अनुसार के अनुसार बदलते हैं। – zoul

+0

फिर दृश्य को ध्यान में आने पर प्रत्येक बार मेनू कार्रवाई को पुन: असाइन करना होगा। टी मेनू तक पहुंचने के लिए: [[[[[NSApp mainMenu] itemWithTitle: @ "ItemName"] मेनू] itemWithTitle @ "ItemName] setAction: @" चयनकर्ता (चयनकर्ता)] –

उत्तर

3

अंत में मैं अपनी खिड़की नियंत्रकों के लिए एक आधार वर्ग को जोड़ कर उसे आगे "बच्चा" नियंत्रकों के लिए कॉल किया:

- (id) childControllerForSelector: (SEL) selector 
{ 
    for (id controller in [childControllers copy]) 
     if ([controller respondsToSelector:selector]) 
      return controller; 
    return nil; 
} 

- (BOOL) respondsToSelector: (SEL) selector 
{ 
    return [super respondsToSelector:selector] ? YES : 
     [self childControllerForSelector:selector] ? YES : 
      NO; 
} 

- (void) forwardInvocation: (NSInvocation*) invocation 
{ 
    id child = [self childControllerForSelector:[invocation selector]]; 
    [invocation invokeWithTarget:child]; 
} 

- (NSMethodSignature*) methodSignatureForSelector: (SEL) selector 
{ 
    NSMethodSignature *signature = [super methodSignatureForSelector:selector]; 
    if (!signature) { 
     id child = [self childControllerForSelector:selector]; 
     signature = [child methodSignatureForSelector:selector]; 
    } 
    return signature; 
} 

यह कोड का एक बहुत कुछ है, लेकिन यह एक सामान्य समाधान है कि नियंत्रक रहता है एड-होक अग्रेषण से कोड मुक्त। उम्मीद है कि यह बहुत ज्यादा जादू नहीं है।

1

आप खिड़की नियंत्रक को खिड़की के प्रतिनिधि के रूप में सेट कर सकते हैं ताकि यह अब उत्तरदाता श्रृंखला का हिस्सा बन सके।

मान लें कि आपके पास NSWindowController का अपना उप-वर्ग है, तो आप वहां मेनू ईवेंट को पकड़ सकते हैं और अपने नियंत्रकों में अपनी उचित विधियों को कॉल कर सकते हैं।

दुर्भाग्यवश, विभिन्न विचारों और सबव्यू के बीच उत्तरदाता श्रृंखला में कुछ भी डालने का प्रयास करने के खिलाफ दस्तावेज़ सलाह, ताकि आप वहां पर अपने व्यू कंट्रोलर को निचोड़ न सकें।

अधिक here, लेकिन मैं इसे लेता हूं कि आपने पहले से ही परामर्श लिया है।

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