0

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

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

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

所以这里使用了两个 Mutable 数组。

保存的numberArray数字(或顺序)TableViewCells。我需要对包含UITableViewCell's text ( 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相同的顺序,如果顺序为 2、3、4、1,我希望将顺序设置为numberArraynumberArray'stableArray'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方法中:

-(void)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];它将核心数据中的所有数据重新加载到数组中,然后用数组填充表格视图。所以我需要能够array在我设置它之前对它进行排序等于self.tableArray

感谢您的帮助!

4

3 回答 3

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]];
}

当您需要一个项目时,例如 in cellForRowAtIndexPath,您可以通过索引访问它:

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

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

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

于 2013-03-06T18:03:56.247 回答
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);

试试这个希望这部分帮助。

于 2013-03-06T17:26:45.510 回答
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  
)
于 2013-03-06T17:31:14.410 回答