2016-06-13 4 views
0

Представьте У меня есть следующие NSDictionaryКак получить IndexPath от NSDictionary

dict = { 
    "a" = [ 
     obj1, 
     obj2, 
     obj3 
    ], 
    "b" = [ 
     obj4, 
     obj5 
    ], 
    "invalid" = [ 
     obj6, 
     obj7, 
     obj8 
    ], 
    "c" = [ 
     obj9, 
     obj10, 
     obj11 
    ] 
} 

Эти данные используются для заполнения TableView с помощью секции из следующего NSArray:

arr = @[@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"U", @"V", @"W", @"X", @"Y", @"Z"]; 

У меня есть следующий метод, который Я пользуюсь найти a объект

- (void)selectRowWithId:(NSNumber *)uid { 
    [dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(id == %@)", uid]; 
     NSArray *filteredDictArray = [obj filteredArrayUsingPredicate:predicate]; 
     if ([filteredDictArray count] > 0) { 

      NSIndexPath *targetIndexPath = nil; 
      //trying to find the NSIndexPath here 

      [[self tableView] selectRowAtIndexPath:targetIndexPath animated:NO scrollPosition:UITableViewScrollPositionMiddle]; 
      [self tableView:[self tableView] didSelectRowAtIndexPath:targetIndexPath]; 
     } 
    }]; 
} 

Скажите, у меня есть объект obj10.

Основываясь на моем NSDictionaryNSArray и NSIndexPath является Section:2 Row:1

Как я могу получить это значение, если я знаю только obj10?

Update (Solution)

Так с комбинацией идей за ответами каждого и моя здесь следующая я использовал в случае, если это полезно для кого-то. BTW: Это для iOS9

- (void)selectRowWithId:(NSNumber *)uid { 
    [dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(id == %@)", uid]; 
     NSArray *filteredDictArray = [obj filteredArrayUsingPredicate:predicate]; 
     if ([filteredDictArray count] > 0) { 

      //trying to find the NSIndexPath here 
      NSIndexPath *targetIndexPath = [NSIndexPath indexPathForRow:[[dict objectForKey:key] indexOfObject:filteredPersonsArray[0]] inSection:[arr indexOfObject:key]]; 

      [[self tableView] selectRowAtIndexPath:targetIndexPath animated:NO scrollPosition:UITableViewScrollPositionMiddle]; 
      [self tableView:[self tableView] didSelectRowAtIndexPath:targetIndexPath]; 
     } 
    }]; 
} 
+1

Правильно ли ваш json. Потому что для всего ключа в словаре он будет массивом. –

+0

Возможно, это неправильно, я обновил ключи для хранения массивов. В основном у меня есть каждый ключ в словаре, содержащий массив объектов. Как мне это показать? Не стесняйтесь редактировать. – RoLYroLLs

+0

Почему раздел = 2? Словарь не сортирует свои ключи. Поэтому вы должны это сделать. Что такое код для этого? Простая буквенно-цифровая сортировка? Тогда это должен быть раздел = 3, не так ли? –

ответ

1

Ваш код является слишком сложным. Иногда обычная петля проще.

[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL * stop) 
{ 
    for(NSInteger index = 0; index < [obj count]; index++) 
    { 
    if ([obj[index] isEqualToString:uid]) 
    { 
     // thats the index 
     // Let's have a look-up for the section 
     NSString *sectionKey = [[key substringToIndex:1] uppercaseString]; //Typo 
     for(NSInteger section=0; section < [arr count]; section++) 
     { 
     if([arr[section] isEqualToString:sectionKey]) 
     { 
      // That's the section 
     } 
     } 
    } 
    } 
} 

Введенный в Safari.

+0

отлично ... Я попробую сейчас. – RoLYroLLs

+0

извините, была опечатка: использование uid вместо ключа. исправлено это. –

+0

Спасибо. Я использовал комбинацию того, что я пытался, и некоторые аспекты того, что вы предоставили. Я закончил использовать следующее после того, как мой оператор 'if ([filterPersonsArray count]> 0':' NSIndexPath * targetIndexPath = [NSIndexPath indexPathForRow: [[dict objectForKey: key] indexOfObject: filterPersonsArray [0]] inSection: [arr indexOfObject: key ]]; ' – RoLYroLLs