2012-02-03 6 views
19

मैं श्रेणियों के एनएसएमयूटेबलएरे के भीतर किसी ऑब्जेक्ट की अनुक्रमणिका प्राप्त करना चाहता हूं।स्ट्रिंग मान का उपयोग करके एनएसएआरएआरई में ऑब्जेक्ट की अनुक्रमणिका कैसे प्राप्त करूं?

श्रेणी ऑब्जेक्ट में "category_title" विशेषता है और मैं श्रेणी_शीर्षक के मान को पार करके इंडेक्स प्राप्त करने में सक्षम होना चाहता हूं।

मैंने दस्तावेज़ों को देखा है और इसके बारे में जाने का एक आसान तरीका नहीं मिल रहा है।

उत्तर

50

NSArray गारंटी नहीं देता है कि आप केवल किसी दिए गए ऑब्जेक्ट की एक प्रति स्टोर कर सकते हैं, इसलिए आपको यह सुनिश्चित करना होगा कि आप इसे स्वयं संभाल लें (या NSOrderedSet का उपयोग करें)।

उस ने कहा, यहां कुछ दृष्टिकोण हैं। यदि श्रेणी श्रेणी शीर्षक से मेल खाने के लिए आपकी श्रेणी ऑब्जेक्ट isEqual: लागू करती है, तो आप केवल -indexOfObject: का उपयोग कर सकते हैं।

यदि आप ऐसा नहीं कर सकते हैं (क्योंकि श्रेणी वस्तुएं समानता की एक अलग परिभाषा का उपयोग करती हैं), -indexOfObjectPassingTest: का उपयोग करें। यह एक ब्लॉक लेता है जिसमें आप अपना "परीक्षण" परिभाषित करने के लिए जो भी परीक्षण करना चाहते हैं - इस मामले में, category_title स्ट्रिंग समानता का परीक्षण करना।

ध्यान दें कि ये सभी NSArray के लिए घोषित किए गए हैं, इसलिए यदि आप केवल NSMutableArray शीर्षलेख/दस्तावेज़ देख रहे हैं तो आप उन्हें नहीं देख पाएंगे।

संपादित करें: कोड नमूना। इस वर्ग CASCategory की वस्तुओं मान लिया गया एक NSString संपत्ति categoryTitle साथ (मैं एक इवर नाम :-) में अंडरस्कोर डाल करने के लिए अपने आप को नहीं ला सकता है:

CASCategory *cat1 = [[CASCategory alloc] init]; 
    [cat1 setCategoryTitle:@"foo"]; 
    CASCategory *cat2 = [[CASCategory alloc] init]; 
    [cat2 setCategoryTitle:@"bar"]; 
    CASCategory *cat3 = [[CASCategory alloc] init]; 
    [cat3 setCategoryTitle:@"baz"]; 

    NSMutableArray *array = [NSMutableArray arrayWithObjects:cat1, cat2, cat3, nil]; 
    [cat1 release]; 
    [cat2 release]; 
    [cat3 release]; 

    NSUInteger barIndex = [array indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { 
     if ([[(CASCategory *)obj categoryTitle] isEqualToString:@"bar"]) { 
      *stop = YES; 
      return YES; 
     } 
     return NO; 
    }]; 

    if (barIndex != NSNotFound) { 
     NSLog(@"The title of category at index %lu is %@", barIndex, [[array objectAtIndex:barIndex] categoryTitle]); 
    } 
    else { 
     NSLog(@"Not found"); 
    } 
+0

धन्यवाद। क्या आप indexOfObjectPassingTest का उपयोग करने के तरीके का एक स्निपेट पोस्ट कर सकते हैं? – jroyce

+1

कृपया मेरा संपादन देखें। –

+0

ठीक है कि बहुत सराहना की गई और वास्तव में जो मैं पूछ रहा था वह किया। – jroyce

1

सुनिश्चित नहीं हैं कि मैं सवाल लेकिन कुछ इस तरह काम कर सकते हैं (समझते हैं परिवर्त्य सरणी संभालने कक्षा की वस्तुएं शामिल हैं "श्रेणी"):

int indx; 
bool chk; 
for (Category *aCategory in theArray) 
{ 
    chk = ([[aCategory category_title] isEqualToString:@"valOfCategoryTitle"]) 
    if (chk) 
     indx = [theArray indexOfObject:aCategory]; 
} 
+0

सिद्धांत में काफी सही (और यदि आपको आईओएस <4 का समर्थन करने की आवश्यकता है तो शायद ऐसा करने के लिए, लेकिन अधिक आधुनिक प्रणालियों के लिए, आपको ब्लॉक-आधारित दृष्टिकोण पर विचार करना चाहिए। –

+0

हाँ ब्लॉक अच्छे हैं लेकिन विचार को स्पष्ट करने के लिए बस इसे सरल रखने की कोशिश कर रहे हैं। –

+0

धन्यवाद। इस जवाब को देखते हुए और कॉनराड शल्ट्ज द्वारा ब्लॉक-आधारित उत्तर प्रबुद्ध है। –

0

और अधिक सरल इस कोड का प्रयास करें: -

int f = [yourArray indexOfObject:@"yourString"]; 
+1

ओपी कस्टम ऑब्जेक्ट्स की एक सरणी खोजना चाहता है, स्ट्रिंग की सरणी नहीं। –

+0

आप इस तरह की ऑब्जेक्ट को भी खोज सकते हैं और मैंने स्ट्रिंग्स और ऑब्जेक्ट्स – Leena

+2

के लिए लागू किया है, लेकिन इसके लिए यह आवश्यक है कि -इस एक्वाल: कस्टम क्लास का ओपी के मामले में श्रेणी-शीर्षक में स्ट्रिंग-समानता जांच करें। यह प्रश्न में इंगित नहीं किया गया है, इसलिए लिखित रूप में यह समाधान आम तौर पर काम नहीं करेगा। –

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