2012-01-29 16 views
8

मॉडल ऑब्जेक्ट्स को देखते हुए NSTreeController दर्शाता है, आप पेड़ में अपने सूचकांक पथ कैसे ढूंढते हैं और बाद में उन्हें चुनते हैं? यह एक अंधेरे से स्पष्ट समस्या प्रतीत होता है, लेकिन मुझे इसका कोई संदर्भ नहीं दिख रहा है। कोई विचार?मॉडल ऑब्जेक्ट दिया गया, NSTreeController में अनुक्रमणिका पथ कैसे खोजें?

उत्तर

18

कोई "आसान" तरीका उपलब्ध नहीं है, तो आप पेड़ नोड्स चलना और मेल खाता हुआ सूचकांक पथ को खोजने के लिए है, कुछ की तरह:

ऑब्जेक्टिव-सी:

श्रेणी

@implementation NSTreeController (Additions) 

- (NSIndexPath*)indexPathOfObject:(id)anObject 
{ 
    return [self indexPathOfObject:anObject inNodes:[[self arrangedObjects] childNodes]]; 
} 

- (NSIndexPath*)indexPathOfObject:(id)anObject inNodes:(NSArray*)nodes 
{ 
    for(NSTreeNode* node in nodes) 
    { 
     if([[node representedObject] isEqual:anObject]) 
      return [node indexPath]; 
     if([[node childNodes] count]) 
     { 
      NSIndexPath* path = [self indexPathOfObject:anObject inNodes:[node childNodes]]; 
      if(path) 
       return path; 
     } 
    } 
    return nil; 
} 
@end  

स्विफ्ट:

एक्सटेंशन

extension NSTreeController { 

    func indexPathOfObject(anObject:NSObject) -> NSIndexPath? { 
     return self.indexPathOfObject(anObject, nodes: self.arrangedObjects.childNodes) 
    } 

    func indexPathOfObject(anObject:NSObject, nodes:[NSTreeNode]!) -> NSIndexPath? { 
     for node in nodes { 
      if (anObject == node.representedObject as! NSObject) { 
       return node.indexPath 
      } 
      if (node.childNodes != nil) { 
       if let path:NSIndexPath = self.indexPathOfObject(anObject, nodes: node.childNodes) 
       { 
        return path 
       } 
      } 
     } 
     return nil 
    } 
} 
+1

ओच, यह वास्तव में अक्षम है। मैं पेड़ नियंत्रक के उप-वर्ग लिखने की सोच रहा हूं जो मॉडल और ट्रीनोड्स के बीच मैपिंग रखता है। या शायद मॉडल पर एक श्रेणी जो संबंधित ट्रीनोड के संदर्भ रखती है। – Tony

+0

पेड़ नोड्स के एक फ्लैट 'एनएसएमयूटेबलएरे' को बनाए रखने के लिए आपको अपने उप-वर्ग में बस इतना करना होगा। आपको सावधान रहना होगा कि नोड्स के सभी संशोधन निश्चित रूप से आपके सरणी में दिखाई देते हैं। –

+0

हम्म, मैं 'एनएसएमयूटेबल डिक्शनरी' या तो मॉडल ऑब्जेक्ट या ऑब्जेक्ट आईडी को 'एनएसटीआरएनओडी' के बारे में सोच रहा था, क्योंकि यह लुकअप के लिए अधिक कुशल लगता है। क्या कोई कारण है 'NSmutableArray' betteR काम कर सकता है? – Tony

-1

इस तरह माता पिता आइटम प्राप्त करने NSOutlineView का उपयोग क्यों नहीं:

NSMutableArray *selectedItemArray = [[NSMutableArray alloc] init]; 

[selectedItemArray addObject:[self.OutlineView itemAtRow:[self.OutlineView selectedRow]]]; 

while ([self.OutlineView parentForItem:[selectedItemArray lastObject]]) { 
    [selectedItemArray addObject:[self.OutlineView parentForItem:[selectedItemArray lastObject]]]; 
} 

NSString *selectedPath = @"."; 
while ([selectedItemArray count] > 0) { 
    OBJECTtype *singleItem = [selectedItemArray lastObject]; 
    selectedPath = [selectedPath stringByAppendingString:[NSString stringWithFormat:@"/%@", singleItem.name]]; 
    selectedItemArray removeLastObject]; 
} 

NSLog(@"Final Path: %@", selectedPath); 

हो जाएगा ताकि उत्पादन: ./item1/item2/item3/...

मुझे लगता है कि आप यहां एक फ़ाइल पथ की तलाश में हैं लेकिन आप जो कुछ भी डेटा स्रोत का प्रतिनिधित्व कर सकते हैं उसके लिए समायोजित कर सकते हैं।

+0

के साथ समाप्त हुआ सवाल यह प्रश्न है कि पेड़ में किसी दिए गए ऑब्जेक्ट के लिए एनएसआईएंडएक्सपैथ की तलाश है, ताकि आप पेड़ नियंत्रक के चयनित इंडेक्सपाथ को प्रोग्रामेटिक रूप से बदल सकें। आप मान रहे हैं कि ऑब्जेक्ट पहले से ही चुना गया है। यदि ऐसा है, तो आप पेड़ नियंत्रक से चयन इंडेक्सपाथ प्राप्त करेंगे! – stevesliva