2009-09-22 7 views
7

मैं एक शीट के रूप में एक एनएसपीनेल दिखाने की कोशिश कर रहा हूं। मैं उन पंक्तियों के साथ कुछ भी कर रहा हूं:एक एनएसपीनल को शीट के रूप में कैसे दिखाएं

SheetController *sheetController = [[[SheetController alloc] 
             initWithWindowNibName:@"Sheet"] autorelease]; 

[[NSApplication sharedApplication] beginSheet:sheetController.window 
           modalForWindow:self.window 
           modalDelegate:self 
           didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) 
            contextInfo:nil]; 

किसी कारण से जो मुझे बढ़ाता है, यह काम नहीं कर रहा है। जब कोड के इस हिस्से को बुलाया जाता है, तो शीट क्षणिक रूप से चमकती है (autorelease संदेश की वजह से)। शीट खिड़की से कभी झुका हुआ नहीं है।

यदि कोई मुझे बता सकता है कि मुझे और जानकारी कहां मिल सकती है, तो इसकी बहुत सराहना की जाएगी।

उत्तर

16

यह आईबी में पैनल के लिए "लॉन्च पर दृश्यमान" बॉक्स की जांच करने के क्लासिक मामले की तरह लगता है। इसे बंद करो।

+0

पर स्पॉट! बहुत धन्यवाद। –

2

हां, जब तक आप इसे जारी रखना जारी रखना चाहते हैं, तब तक आपको इस नियंत्रक के स्वामित्व की आवश्यकता है। आप इसे अभी नहीं बना सकते हैं, इसे स्वतः स्वामित्व दें, और इसे मरने दें- आपको इसे तब तक पकड़ने की आवश्यकता है जब तक आपको इसकी आवश्यकता हो।

+0

ऑटोरेलीज़ संदेश को हटाने के दौरान पैनल गायब होने से रोकता है, यह अभी भी खिड़की से जुड़ा हुआ नहीं है ... मैं वास्तव में इससे परेशान हूं। –

+2

बस इसे स्वत: नहीं करने के लिए पर्याप्त नहीं है। यह सिर्फ एक रिसाव है। आपके द्वारा बनाए गए कार्यों के स्वामित्व की आवश्यकता है, और जब आप इसके साथ काम करते हैं तो इसे छोड़ दें (और * केवल * तब)। नियंत्रक को विंडो पर नियंत्रित करने के लिए इसे नियंत्रित करने के लिए, आपको यह सुनिश्चित करना होगा कि आपने फ़ाइल के स्वामी की कक्षा निर्धारित की है, फिर अपने नियंत्रक के 'विंडो' आउटलेट को विंडो पर कनेक्ट करें। आप आईबी में दोनों ही करते हैं। –

1

यह मत भूलना कि अगर आप इसे "मोडल" शीट के रूप में चलाने की कोशिश कर रहे हैं (यानी यह ऐप को तब तक ले जाता है जब तक उपयोगकर्ता इसे खारिज नहीं करता), आपको एक नया रन लूप धक्का देना होगा।

आपने जो किया है वह शीट दिखाया गया है, और फिर एक नया पाश नहीं धक्का दिया गया है, इसलिए ओएस केवल शीट दिखाता है, देखता है कि इसे चलाने के लिए कोई कारण नहीं है, और इस प्रकार इसे बंद कर देता है और अगले पर निष्पादन शुरू करता है रेखा:

- (id)showPanelModalAgainstWindow: (NSWindow *)window 
{ 
    [[NSApplication sharedApplication] beginSheet: panelToShow 
       modalForWindow: window 
       modalDelegate: self 
       didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:) 
       contextInfo: nil]; 

    [[NSApplication sharedApplication] runModalForWindow: panelToShow]; 
    if (m_returnCode == NSCancelButton) return nil; 
} 


- (void)sheetDidEnd:(NSWindow *)sheet 
     returnCode:(int)returnCode 
     contextInfo:(void *)contextInfo 
{ 
    UNUSED(sheet); 
    UNUSED(contextInfo); 
    m_returnCode = returnCode; 
} 

फिर, अपने को स्वीकार करने और/या रद्द बटन दिनचर्या में:

मैं आम तौर पर चादरें निम्नलिखित तरीके से करना

- (IBAction)continueButtonClicked:(id)sender 
{ 
    UNUSED(sender); 
    [[NSApplication sharedApplication] stopModal]; 
    [createAccountWizardPanel orderOut: nil]; 
    [[NSApplication sharedApplication] endSheet: createAccountWizardPanel 
             returnCode: NSOKButton]; 

} 

मुझे यकीन है कि वहाँ के रूप में कर रहा हूँ ऐसा करने का हल्का कम कोड-वाई तरीका, लेकिन मैंने इसमें गहराई से देखा नहीं है, क्योंकि इस तरह से अब तक पूरी तरह से ठीक काम करता है ....

नियंत्रक और पैनल ऑब्जेक्ट्स के जीवनकाल के बारे में पिछली टिप्पणियां भी हैं प्रासंगिक - मॉड्यूल पैनल दिखाते समय जीवनकाल के लिए आपको किन वस्तुओं की आवश्यकता होती है, यह समझना सुनिश्चित करें।

+0

यह विधि बहिष्कृत है :( – ColdSteel

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