使用NSPredicate对NSArray进行排序,然后存储在新数组中

时间:2013-03-06 17:14:58

标签: iphone ios objective-c core-data nspredicate

我有一个UITableView,它通过一个数组(tableArray)填充,该数组从核心数据中填充。

每个UITableViewCell在创建时被分配一个数字,并且数字存储在一个数组中。 (numberArray

当用户重新排序行时,数字会在数组中移动(当然与tableView一起)

这里使用了两个Mutable数组。

numberArray保存TableViewCells的数字(或顺序)。 我需要对包含UITableViewCell文本的数组进行排序(tableArray) 反映numberArray所持有的相同顺序。

另外,这很重要:正如我之前所说,每个单元格都被分配了一个数字,这个数字存储在numberArray

我需要对两个数组进行排序,以便在同一个地方保存相同的值。

例如:

tableArray持有一些物品:

1) hi
2) whats Up
3) this
4) is cool!

因此您可以看到此处的每个对象都分配了数字1-4。 并将这些数字中的每一个添加到numberArray

用户可以移动单元格,因此数字的顺序会发生变化。

所以当视图加载时,我需要得到numberArray的确切顺序,无论它是

1,2,3,4 or 2,4,3,1

我需要对tableArray进行排序以反映与numberArray相同的顺序 因此,当视图加载时,如果numberArray's订单为2,3,4,1,我希望将tableArray's订单设置为

2“whats up”,3“this”,4“很酷!”,1“hi”。

我相信我可以通过NSPredicate来做到这一点。

非常感谢任何帮助!

修改

cellForRow:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString * identifier = @"identifier";

self.myCell = [tableView dequeueReusableCellWithIdentifier:identifier];

if (self.myCell == nil) {
    self.myCell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}

HandgunAmmo *handgunAmmo = [self.tableArray objectAtIndex:indexPath.row];
self.myCell.brandLabel.text = handgunAmmo.brand;
self.myCell.caliberLabel.text = handgunAmmo.caliber;
self.myCell.numberOfRoundsLabel.text = handgunAmmo.numberOfRounds;
return self.myCell;
}

在我的viewWIllAppear方法中:

- (无效)viewWillAppear中:(BOOL)动画{

if (self.context == nil)
{
    self.context = [(RootAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}
NSFetchRequest *request = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"HandgunAmmo" inManagedObjectContext:self.context];
[request setEntity:entity];
NSError *error;
NSMutableArray *array = [[self.context executeFetchRequest:request error:&error] mutableCopy];
    [self setTableArray:array];

[self.ammoTable reloadData];
[super viewWillAppear:YES];
}

因此,数组在更改时不会保持持久性的原因是因为我从核心数据加载数据,并且我调用[self setTableArray:array];将核心数据中的所有数据重新加载到数组中,然后填充带有数组的tableview。所以我需要能够在将array设置为等self.tableArray之前对其进行排序。

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

为什么不让tableArray保持不变,并将numberArray作为索引用于另一个数组。

您可以使用

numberArray初始化为0, 1, 2, ..., n-1
numberArray = [NSMutableArray array];
for (NSUInteger i = 0; i < [tableArray count]; i++) {
     [numberArray addObject:[NSNumber numberWithUnsignedInteger:i]];
}

当您需要物品时,例如在cellForRowAtIndexPath中,您可以通过索引访问它:

NSUInteger i = [[numberArray objectAtIndex:row] unsignedIntegerValue];
NSString *item = [tableArray objectAtIndex:i];

现在您只需要重新排序numberArray,更改将自动反映在表格视图中。

更新:可以在此处找到处理表格视图中核心数据对象重新排序的好解决方案:UITableView Core Data reordering

答案 1 :(得分:1)

NSMutableArray *unsortedArray = [NSMutableArray arrayWithObjects:@"1) hi",@"2) whats Up",@"3) this",@"4) is cool!",nil];
NSArray *guideArray = [NSArray arrayWithObjects:@"2",@"4",@"3",@"1", nil];

for(int i=0; i< [guideArray count];i++)
{
    for(int j=0; j< [unsortedArray count];j++)
    {
        if([[[unsortedArray objectAtIndex:j] substringToIndex:[[guideArray objectAtIndex:i] length]] isEqualToString:[guideArray objectAtIndex:i]])
        //if([[unsortedArray objectAtIndex:j] containsObject:[guideArray objectAtIndex:i]])
        {
            [unsortedArray exchangeObjectAtIndex:j withObjectAtIndex:i];
            break;                
        }
    }
}

NSLog(@"%@",unsortedArray);

guideArray = @[@"2",@"4",@"3",@"1"];
unsortedArray = [@[@[@"1) hi"],
                   @[@"2) wats up "],
                   @[@"3) this,"],
                   @[@"4) cool"]] mutableCopy];

[unsortedArray sortUsingComparator:^(id o1, id o2) {
    NSString *s1 = [o1 objectAtIndex:0];
    s1 = [s1 substringToIndex:[s1 rangeOfString:@")"].location];
    NSString *s2 = [o2 objectAtIndex:0];
    s2 = [s2 substringToIndex:[s2 rangeOfString:@")"].location];
    NSInteger idx1 = [guideArray indexOfObject:s1];
    NSInteger idx2 = [guideArray indexOfObject:s2];
    return idx1 - idx2;
}];
NSLog(@"%@",unsortedArray);

试试这个希望部分帮助。

答案 2 :(得分:1)

我无法通过谓词

找到解决方法
NSArray *stringArray = @[@"hi", @"what's up?", @"this", @"is cool"];
NSArray *numberArray = @[@2, @4, @3, @1];
NSMutableArray *combinedArray = [NSMutableArray array];

//connect string with the numbers of there new position
[numberArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSString *string =stringArray[[obj integerValue]-1];
    [combinedArray addObject:@[string, obj]];
}];


NSMutableArray *orderedArray = [NSMutableArray array];
[combinedArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [orderedArray addObject:obj[0]];
}];

NSLog(@"%@", orderedArray);

结果

(
    "what's up?",
    "is cool",
    this,
    hi  
)