Ios 筛选关键IO的NSArray对象

Ios 筛选关键IO的NSArray对象,ios,objective-c,cocoa-touch,nsarray,Ios,Objective C,Cocoa Touch,Nsarray,我有一个NSArray,里面填充了json对象,格式如下: @"name" : @"a.smith" @"age" : @"23" @"badge" : @"red" @"name" : @"f.wren" @"age" : @"31" @"badge" : @"blue" @"name" : @"j.liby" @"age" : @"19" @"badge" : @"red" 我正在尝试创建一个新的NSMutableArray仅填充badge=@“red”的对象 seg是我现有的NSAr

我有一个
NSArray
,里面填充了
json
对象,格式如下:

@"name" : @"a.smith"
@"age" : @"23"
@"badge" : @"red"

@"name" : @"f.wren"
@"age" : @"31"
@"badge" : @"blue"

@"name" : @"j.liby"
@"age" : @"19"
@"badge" : @"red"
我正在尝试创建一个新的
NSMutableArray
仅填充
badge=@“red”的对象

seg
是我现有的
NSArray
包含所有对象。这些用于填充自定义的
tableViewCell

NSArray *seg = [selections objectAtIndex:indexPath.row];
NSMutableArray *newBadgeArray = [[NSMutableArray alloc]init];
if ([[[seg objectAtIndex:indexPath.row] valueForKey:@"badge"] isEqualToString:@"red"])  {
    [newBadgeArray insertObject:seg atIndex:indexPath.row];
}
我得到下面的错误,不知道为什么

由于未捕获异常“NSRangeException”而终止应用程序,原因:“***-[\uu NSArrayM objectAtIndex:]:索引4超出边界[0..3]”


如果要筛选数组以在tableview中显示,则必须在tableview的datasource和delegate方法之外对其进行筛选

@interface YourVC()
@property (strong, nonatomic) NSMutableArray *newBadgeArray;
@end

@implementation YourVC
- (void)viewDidLoad
{
    [super viewDidLoad];
    //...

    NSArray *seg = //initialize your array 
    this.newBadgeArray = [[NSMutableArray alloc]init];
    if ([[[seg objectAtIndex:indexPath.row] valueForKey:@"badge"] isEqualToString:@"red"])  {
        [newBadgeArray insertObject:seg atIndex:indexPath.row];  
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    retirn newBadgeArray.count;
}

您可以在viewDidLoad本身中获得过滤后的数组。为简单起见,请使用快速枚举

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

for (NSArray *seg in selections) {
    NSLog(@"seg array: %@", seg);

    [seg enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop){
        if ([[[seg objectAtIndex:index] valueForKey:@"badge"] isEqualToString:@"red"])  {
            [newBadgeArray addObject:seg];
        }
    }];
}

可能会得到
indexPath.row==4
,而
seg
只有3项。确保不要为表delegateYes返回较大的数字。可能是这样。我猜您正在使用数组作为表视图中的数据源。请检查表视图中的行数。它应该等于数组的长度。表视图中的行数是多少?它是硬编码的吗?你说过“seg”是包含所有对象的数组。那么什么是“selections”数组?我在委托方法中使用上述方法来设置numberOfRows。如果([selections count]>0){NSArray*seg=[selections objectAtIndex:indexath.row];返回[seg count];这是可以工作的原始方法,但现在我希望它只包含valueForKey@“badge”的对象:@“red”