2016-01-20 4 views
0

Прошу прощения, я плохо разбираюсь в английском, возможно, не могу описать проблему четко. Тогда код:NSMutableDictionary <NSString *, NSMutableArray *>

Я объявил свойство, как мой источник данных

@property (nonatomic, strong) NSMutableDictionary<NSString*,NSMutableArray*> *sectionData; 

и инициализируется как self.sectionData[fir] = [NSMutableArray array]; убедитесь, что объект NSMutableArray в словаре. но когда я получать данные как

NSMutableArray *subArray =self.sectionData[self.sectionNames[indexPath.section]]; 
NSLog(@"%@",NSStringFromClass([subArray class])); 

консоль показывает: __NSArrayI
почему это происходит, почему не NSMutableArray, и теперь я не могу удалить некоторые детали в источнике данных,

код, который я добавить инициализацию мой источник данных:

- (NSMutableArray *)sectionNames 
{ 
    if (!_sectionNames) { 
     _sectionNames = [NSMutableArray array]; 
     self.sectionData = [NSMutableDictionary dictionary]; 
     NSString *sourceStr = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"states" ofType:@"txt"] encoding:NSUTF8StringEncoding error:nil]; 

     NSArray *states = [sourceStr componentsSeparatedByString:@"\n"]; 
     [states enumerateObjectsUsingBlock:^(NSString * str, NSUInteger idx, BOOL * _Nonnull stop) { 

      if ([str isNotNullOrWhiteSpace]) { 
       unichar chars[] = {[str characterAtIndex:0]}; 
       NSString *fir = [[NSString stringWithCharacters:chars length:1] uppercaseString]; 

       if (![_sectionNames containsObject:fir] && ![fir isEqualToString:@""]) { 

        [_sectionNames addObject:[fir uppercaseString]]; 
        self.sectionData[fir] = [NSMutableArray array]; 
       } 
       [self.sectionData[fir] addObject:str]; 
      } 
     }]; 

     //对sectionData中的array元素对象进行排序 
     __weak typeof(self) weakSelf = self; 
     [self.sectionData enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSMutableArray *obj, BOOL * _Nonnull stop) { 

      weakSelf.sectionData[key] = [[obj sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { 

       return [[obj1 uppercaseString] compare:[obj2 uppercaseString]]; 
      }] copy]; 
     }]; 

    } 
    return _sectionNames; 
} 

, а затем я удалить некоторые выбранные элементы:

- (void)doDelete:(UIBarButtonItem*)deleteBtn 
{ 
    NSArray *deletedIndexpathes = [self.collectionView indexPathsForSelectedItems]; 
    if (deletedIndexpathes.count == 0) return; 
    //sort 
    deletedIndexpathes = [deletedIndexpathes sortedArrayUsingSelector:@selector(compare:)]; 
    deletedIndexpathes = [[deletedIndexpathes reverseObjectEnumerator]allObjects]; 

    //delete data 
    NSMutableIndexSet *emptySections = [NSMutableIndexSet indexSet]; // keep track of what sections get emptied 

    [deletedIndexpathes enumerateObjectsUsingBlock:^(NSIndexPath * indexPath, NSUInteger idx, BOOL * _Nonnull stop) { 

     NSMutableArray *subArray =(NSMutableArray *)self.sectionData[self.sectionNames[indexPath.section]]; 

     NSLog(@"%@",NSStringFromClass([subArray class])); 
//  [ subArray removeObjectAtIndex: indexPath.item]; 

//  NSLog(@"%@",self.sectionData[self.sectionNames[indexPath.section]]); 
     //如果一个section里面没有item,追踪下来 
//  if (cArray.count == 0) { 
////   [emptySections addObject:[NSNumber numberWithInteger:indexPath.section]]; 
//   [emptySections addIndex:indexPath.section]; 
//  } 
    }]; 

но Подмассив является NSArray, что я удалить .... Канн `

+0

'[aa class]', вы имеете в виду '[subArray class]'? Вы можете сделать 'self.sectionData [fir] = [NSMutableArray array];', но где вы точно задаете данные? – Larme

+0

ooh, it's [subArray класс]. данные были установлены в методе getter. – Evoque

+0

Как вы добавляете данные? Например, если do 'self.sectionData [fir] = [NSMutableArray array] ;, но затем выполните' self.sectionData [fir] = @ [dataFetch1, dataFetch2]; 'вы даете' NSArray' там. – Larme

ответ

0

заменить

weakSelf.sectionData[key] = [[obj sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { 

       return [[obj1 uppercaseString] compare:[obj2 uppercaseString]]; 
      }] copy]; 

в

weakSelf.sectionData[key] = [[obj sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { 

      return [[obj1 uppercaseString] compare:[obj2 uppercaseString]]; 
     }] mutableCopy]; 

copy ->mutableCopy.

+0

Вау, спасибо, так что так ... много .... !!!!! – Evoque

Смежные вопросы