2012-01-06 10 views
5

नहीं कहा जाता है, मैं एक नए कार्यक्रम के लिए स्रोत सूची बनाने की कोशिश कर रहा हूं और मुझे दृश्य-आधारित NSOutlineView का उपयोग करके एक छोटी सी समस्या है। मेरा कोड सेल-आधारित NSOutlineView का उपयोग करके ठीक काम करता है, इसलिए मैं क्या हो रहा है इसके बारे में थोड़ा उलझन में हूं।रूपरेखा देखें: objectValueForTableColumn: byItem:

#pragma mark - 
#pragma mark NSOutlineView Delegate 

- (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item { 
    return (item == nil) ? YES : [(SourceListNode *)item groupItem]; 
} 

- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    if ([(SourceListNode *)item groupItem]) { 
     return [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
    } 
    else { 
     return [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 
    } 
} 

#pragma mark - 
#pragma mark NSOutlineView Data Source 

- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { 
    return (item == nil) ? [sourceListNodes count] : [(SourceListNode *)item numberOfChildren]; 
} 

- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { 
    return (item == nil) ? YES : ([(SourceListNode *)item numberOfChildren] > 0); 
} 

- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item { 
    return (item == nil) ? [sourceListNodes objectAtIndex:index] : [(SourceListNode *)item childAtIndex:index]; 
} 

- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { 
    return [(SourceListNode *)item name]; 
} 

जब मैं डिबगर के माध्यम से इस चलाने यह देखते हैं कि outlineView:objectValueForTableColumn:byItem: निष्पादित नहीं करता है:

यहाँ प्रतिनिधि और डेटा स्रोत के लिए मेरी कोड है। परिणाम कोई पाठ के साथ एक रूपरेखा दृश्य है। सही कोशिकाएं बनाई जाती हैं और मैं उन्हें चुनने और उन्हें विस्तारित करने में सक्षम हूं। मैं क्या खो रहा हूँ?

अद्यतन: मैंने आईबी में अपनी स्रोत सूची हटा दी, एक नया जोड़ा, और इसे मेरे नियंत्रक ऑब्जेक्ट से कनेक्ट किया। परिणाम बेहतर थे, लेकिन हेडर कोशिकाओं में "हेडर सेल" टेक्स्ट था और बाल कोशिकाओं में "टेबल व्यू सेल" था।

मैंने फिर से डीबगर के माध्यम से कार्यक्रम चलाया और इस बार outlineView:objectValueForTableColumn:byItem: निष्पादित किया गया था। हालांकि यह सेल के पाठ को पॉप्युलेट नहीं करता था।

मैं तो outlineView:viewForTableColumn:item: अद्यतन इस प्रकार है:

- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    NSTableCellView *result; 
    if ([(SourceListNode *)item groupItem]) { 
     result = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
    } 
    else { 
     result = [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 
    } 

    [[result textField] setStringValue:[(SourceListNode *)item name]]; 

    return result; 
} 

अब सब कुछ उम्मीद के रूप में काम करता है।

तो संक्षेप में, मैंने अपनी समस्या हल कर ली है। हालांकि, अब मेरे पास एक और सवाल है। व्यू-बेस रूपरेखा दृश्यों के लिए outlineView:objectValueForTableColumn:byItem: का उद्देश्य क्या है? यह निष्पादित करता है, लेकिन कुछ भी नहीं दिखता है।

+0

हाय जॉन, क्या आपने यह पता लगाया कि ऑब्जेक्ट ValueForTableColumn को देखने-आधारित रूपरेखा दृश्य के लिए क्यों आवश्यक है? मैं खुद वही बात सोच रहा हूं। – Indoor

उत्तर

4

व्यू-आधारित सेल-आधारित से अलग है।

जो कुछ अलग है वह "आईडी" रिटर्न मान को "NSView" में बदल रहा है।

बदलें इस:

- (id)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item 
इस के लिए

:

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item 

यह धारणा दिया जाता है आप 10.7 चल रहे हैं, और आप वास्तव में जा रहा एक NSView वापस जाने के लिए कर रहे हैं।

+0

मैंने 'id' को 'NSView *' में बदल दिया। इसने मेरे अपडेट के परिणाम (मूल पोस्ट में) नहीं बदला। –

+0

मुझे इसे पकड़ने के लिए आपको धन्यवाद देना चाहिए। –

+0

एक NSTableCellView वापस न करें। एक NSView वापस करें। आपके द्वारा वापस आने वाले एनएसवीव में प्रारंभिक फ्रेम नहीं होना चाहिए; आपके लिए एनएससींट्रोल नियंत्रण करता है। एक नया NSView पॉप्युलेट करें, इसमें तत्व जोड़ें - फिर इसे वापस करें। – evdude100