2010-10-01 16 views
9

से एक प्रतिनिधि के रूप में क्विकलुक उपभोक्ता NSView में किसी तालिका से QuickLook कार्यक्षमता को लागू करने में कुछ समस्याएं आ रही हैं। QuickLook पर सीमित दस्तावेज़ीकरण वास्तव में मदद नहीं करता है।एनएसवी व्यू कंट्रोलर

Apple Docs (जो कस्टम जेनरेटर और प्लगइन्स की ओर भारी रूप से तैयार होते हैं) के माध्यम से पढ़ने के बाद, मैं QuickLookDownloader sample code को देखकर समाप्त हुआ। यह कोड दस्तावेज़-आधारित अनुप्रयोग पर आधारित है, लेकिन मेरे लिए सही तरीका प्रतीत होता है (आखिरकार यह ऐप्पल का कोड है और यह उनके प्रोजेक्ट में काम करता है)।

मेरे कार्यान्वयन में मैं बस ठीक दिखाने के लिए QuickLook panel प्राप्त कर सकता हूं, और मैं इसे जितना आसान बना सकता हूं। हालांकि, पैनल स्वयं कभी भी NSViewController के भीतर से प्रतिनिधि विधियों को कॉल नहीं करता है। नतीजतन मैं वस्तुओं को प्रदर्शित करने के लिए कभी भी नहीं मिलता, केवल शब्द "कोई आइटम नहीं चुना गया"। और मैं फंस गया हूँ।

मैं एक setDelegate कॉल करने की कोशिश, लेकिन अगर मैं उस मार्ग नीचे जारी रखने के लिए आसन्न कयामत बारे में चेतावनी दी हो ...

[QL] QLError(): - [QLPreviewPanel setDelegate:] जबकि पैनल नहीं है कहा जाता है नियंत्रक - इसे ठीक करें या यह जल्द ही उठाएगा। QLPreviewPanel.h में टिप्पणियां देखें -स्रेप्ट्सप्रूवपैनल नियंत्रण:/- startPreviewPanelControl:/- endPreviewPanelControl:।

और फिर प्रतिनिधिमंडल विधियों में से किसी एक को प्रतिक्रिया देने का प्रयास करते समय फिर भी एक डीलोक के साथ ऐसा होता है।

और हाँ मैंने हेडर पढ़ा जो पुष्टि करता है कि पैनल को जीतने के बाद मुझे प्रतिनिधि को सेट करना चाहिए (नीचे कोड देखें)।

तो मेरा कोड यहां है, जो नमूना कोड से बहुत अधिक नमूना कोड से मेल खाता है) जहां मुझे अपना डेटा मिलता है (मुझे इसे NSArrayController से मिलता है) और बी) जहां से मेरा पूर्वावलोकन आइटम मिलता है (मेरा आता है (वे निश्चित रूप से कभी नहीं कहा जाता है) या वैसे भी चाहिए)

@interface MyViewController : NSViewController 
    <QLPreviewPanelDataSource, QLPreviewPanelDelegate> { 

    QLPreviewPanel * previewPanel; 
    NSArrayController * myArrayController; 
    NSTableView * myTable; 

    // [...] Other instance vars 
} 

@implementation MyViewController 

// [...] all the other methods, init, dealloc etc... 

-(IBAction)togglePreviewPanel:(id)previewPanel { 

    if ([QLPreviewPanel sharedPreviewPanelExists] && 
      [[QLPreviewPanel sharedPreviewPanel] isVisible]) 
    { 
     [[QLPreviewPanel sharedPreviewPanel] orderOut:nil]; 
    } 
    else 
    { 
     [[QLPreviewPanel sharedPreviewPanel] makeKeyAndOrderFront:nil]; 
    } 
} 

-(BOOL)acceptsPreviewPanelControl:(QLPreviewPanel *)panel 
{  
     return YES; 
} 

// This document is now responsible of the preview panel. 
// It is allowed to set the delegate, data source and refresh panel. 

-(void)beginPreviewPanelControl:(QLPreviewPanel *)panel 
{ 

    if (DEBUG) NSLog(@"QuickLook panel control did BEGIN"); 

    previewPanel = [panel retain]; 
    panel.delegate = self; 
    panel.dataSource = self; 
} 

// This document loses its responsisibility on the preview panel. 
// Until the next call to -beginPreviewPanelControl: it must not change 
// the panel's delegate, data source or refresh it. 

-(void)endPreviewPanelControl:(QLPreviewPanel *)panel 
{ 
    [previewPanel release]; 
    previewPanel = nil; 

    if (DEBUG) NSLog(@"QuickLook panel control did END"); 
} 

// Quick Look panel data source 

-(NSInteger)numberOfPreviewItemsInPreviewPanel:(QLPreviewPanel *)panel 
{ 

    if (DEBUG) NSLog(@"QuickLook preview count called"); 

    return [[myArrayController selectedObjects] count]; 
} 

-(id <QLPreviewItem>)previewPanel:(QLPreviewPanel *)panel 
     previewItemAtIndex:(NSInteger)index 
{ 

    if (DEBUG) NSLog(@"QuickLook preview selection of item called"); 

    return [[displayAC selectedObjects] objectAtIndex:index]; 
} 

-(BOOL)previewPanel:(QLPreviewPanel *)panel handleEvent:(NSEvent *)event { 

    if (DEBUG) NSLog(@"QuickLook panel error handler called"); 

// redirect all key down events to the table view 

    if ([event type] == NSKeyDown) { 
     [myTable keyDown:event]; 
    return YES; 
    } 

    return NO; 
} 

मुद्दा है कि acceptsPreviewPanelControl कहा जाता हो जाता है कभी नहीं लगता है, इसलिए प्रतिनिधियों कभी नहीं आदत हो - सीधे अपने मॉडल वस्तु से।

मुझे यकीन है कि यह एक आसान कदम है जिसे मैं याद कर रहा हूं, लेकिन नमूना कोड को विच्छेदन करने और दस्तावेज़ों पर scouring के बाद मुझे जवाब नहीं दिख रहा है।

ऐसा इसलिए है क्योंकि यह सब एक NSViewController के भीतर से है (हालांकि मुझे कोई कारण नहीं दिख रहा है कि यह समीकरण में क्यों आना चाहिए)?

किसी भी और सभी की बहुत सराहना की गई।

समाधान अद्यतन

पीटर अवलोकन के लिए धन्यवाद, ठीक एक त्वरित एक था। जब आप डीबगर में त्रुटि संदेश का अर्थ है तो क्या आप इससे नफरत करते हैं? :-)

MyViewController लोड करने वाली मेरी कक्षा में मुझे समस्या को ठीक करने के लिए कोड की तीन पंक्तियां जोड़ने की आवश्यकता थी।

// mainWindow is an IBOutlet to my window because the calling class 
// is a simple object and not an NSWindowController otherwise I could 
// have used `self` instead of `mainWindow` 

NSResponder * aNextResponder = [mainWindow nextResponder]; 

[mainWindow setNextResponder:myViewControllerInstance]; 
[myViewControllerInstance setNextResponder:aNextResponder]; 

नौकरी पूर्ण :-) धन्यवाद पीटर।

उत्तर

6

यदि आप अभी तक इसके प्रतिनिधि नहीं हैं तो आप इसे प्रतिनिधि संदेश क्यों भेजने की उम्मीद करेंगे? अगर आप इसे प्रतिनिधि संदेश भेजना चाहते हैं, तो आपको खुद को अपने प्रतिनिधि के रूप में स्थापित करने की आवश्यकता है।

मैं एक setDelegate कॉल करने की कोशिश, लेकिन अगर मैं उस मार्ग नीचे जारी रखने के लिए आसन्न कयामत बारे में चेतावनी दी हो ...

[QL] QLError(): -[QLPreviewPanel setDelegate:] कहा जाता है जबकि पैनल कोई नियंत्रक है - इसका समाधान करें या यह जल्द ही उठाएगा। -acceptsPreviewPanelControl:/-beginPreviewPanelControl:/-endPreviewPanelControl: के लिए QLPreviewPanel.h में टिप्पणियां देखें।

"कोई नियंत्रक" नहीं कहता है। तो, आपको नियंत्रक होने की आवश्यकता है।

कि शीर्ष लेख पर टिप्पणी, विशेष रूप से acceptsPreviewPanelControl: पर और QLPreviewPanel उदाहरण विधि updateController का सुझाव है कि पैनल के नियंत्रक, जब यह एक है, एक वस्तु प्रत्युत्तर श्रृंखला में है। इसलिए, यदि आपका नियंत्रक पैनल के नियंत्रक नहीं बन रहा है, तो ऐसा इसलिए है क्योंकि आपका नियंत्रक उत्तरदाता श्रृंखला में नहीं है।

तो, इसे ठीक करें, और फिर यह काम करेगा।

मैं कल्पना करता हूं कि आपका व्यू कंट्रोलर उत्तरदाता श्रृंखला में होना चाहिए जब भी उसका विचार या कोई सबव्यू उत्तरदाता श्रृंखला में होता है, लेकिन शायद ऐसा नहीं है। The documentation नहीं कहता है। यदि सब कुछ विफल हो जाता है, तो स्वयं को कुछ दृश्य के अगले उत्तरदाता के रूप में स्पष्ट रूप से सेट करें (और इसके पिछले उत्तरदाता को आपके अगले उत्तरदाता के रूप में), फिर पूर्वावलोकन पैनल को updateController संदेश भेजें।

+0

सामान्य रूप से पीटर आपका अवलोकन मेरे तरीकों में त्रुटि थी। मैंने इस धारणा को अनदेखा कर दिया था कि NSViewController को प्रतिक्रियाकर्ता श्रृंखला में जोड़ने की आवश्यकता है (एक विंडो नियंत्रक के विपरीत जो स्वचालित रूप से शामिल हो जाता है)। कोड की 3 लाइनें और समस्या स्वचालित रूप से तय की गई है! धन्यवाद। देर रात तक। आप जानते हैं कि यह कैसे जाता है :-) – Hooligancat

+0

मेरा मतलब है कि आपने मेरे तरीकों में त्रुटि देखी है, न कि आपका अवलोकन त्रुटि है! – Hooligancat

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