Прошу прощения, я плохо разбираюсь в английском, возможно, не могу описать проблему четко. Тогда код: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, что я удалить .... Канн `
'[aa class]', вы имеете в виду '[subArray class]'? Вы можете сделать 'self.sectionData [fir] = [NSMutableArray array];', но где вы точно задаете данные? – Larme
ooh, it's [subArray класс]. данные были установлены в методе getter. – Evoque
Как вы добавляете данные? Например, если do 'self.sectionData [fir] = [NSMutableArray array] ;, но затем выполните' self.sectionData [fir] = @ [dataFetch1, dataFetch2]; 'вы даете' NSArray' там. – Larme