0

コア データから入力さUITableViewれる配列 ( ) を介して入力される があります。tableArray

それぞれUITableViewCellに作成時に番号が割り当てられ、番号は配列に格納されます。( numberArray)

ユーザーが行を並べ替えると、数字は配列内で移動します(もちろん、と組み合わせてtableView

したがって、ここでは 2 つの Mutable 配列が使用されています。

はのnumberArray番号 (または順序) を保持しますTableViewCellsUITableViewCellのテキスト ( ) を保持する配列をソートして、 が保持する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「どういたしまして」、3「これ」、4「かっこいい!」、1「こんにちは」。

私はこれを介してこれを行うことができると信じています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

numberArraytoを次のように初期化し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あり、変更はテーブル ビューに自動的に反映されます。

更新:テーブル ビューで Core Data オブジェクトの並べ替えを処理するための適切なソリューションは、ここにあります: UITableView Core Data reordering

于 2013-03-06T18:03:56.247 に答える
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 に答える
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 に答える