1

これについて多くの質問があることは知っていますが、解決策を見つけることなく、それぞれの質問を調べました。チュートリアルからテーブルビューの行の位置を編集するためのコードを取得しましたが、それは完全に機能しますが、ビューを変更してからtableViewページに戻るたびに(ViewDidAppearメソッドが発生すると思います)、編集されたすべての行前の位置に戻ります。これは私のコードです:

ボタンに関連するアクションを編集します。

- (void)editAction:(id)sender
{
    if(self.editing)
    {
        [super setEditing:NO animated:NO];
        [[self tableView] setEditing:NO animated:NO];
        [[self tableView] reloadData];
        [self.navigationItem.leftBarButtonItem setTitle:@"Edit"];
        [self.navigationItem.leftBarButtonItem setStyle:UIBarButtonItemStylePlain];
        [_tableData removeAllObjects];
    }
    else
    {
        [super setEditing:YES animated:YES];
        [[self tableView] setEditing:YES animated:YES];
        [[self tableView] reloadData];
        [self.navigationItem.leftBarButtonItem setTitle:@"Done"];
        [self.navigationItem.leftBarButtonItem setStyle:UIBarButtonItemStyleDone];
        [_tableData removeAllObjects];
    }
}

編集方法:

// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
    NSString *item = [self.datas objectAtIndex:fromIndexPath.row];
    [self.datas removeObjectAtIndex:fromIndexPath.row];
    [self.datas insertObject:item atIndex:toIndexPath.row];

}

// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the item to be re-orderable.
    return YES;
}

ViewDidAppear

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [_tableData removeAllObjects];
    // Fetch the devices from persistent data store
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Data"];
    self.datas = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];

    [self.tableView reloadData];
}

cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        cell.textLabel.text = [_searchDati objectAtIndex:indexPath.row];

    } else {
        NSString *string;
        //configure cells
        NSManagedObject *data = [self.datas objectAtIndex:indexPath.row];
        string = [NSString stringWithFormat:@"%@", [data valueForKey:@"name"]];
        [cell.detailTextLabel setText:nil];
        cell.textLabel.text = string;

        //tableData array used for filtering
        [_tableData addObject:string];
    }

    return cell;
}

NSMutableArray tableData は、UISearchbar. どこに問題があるのか​​ わかりません。コアデータは に関連している@property (strong) NSMutableArray *datas;ので、配列を変更しても問題ないと思いましたが、そうdatasではないかもしれません。前もって感謝します。

4

1 に答える 1

3

あなたのアプローチには2つの問題があります:

  • executeFetchRequest:は管理対象オブジェクトの を返しますNSArrayが、フェッチ要求に並べ替え記述子を追加しない限り、要素の順序は指定されていません。
  • Yourself.dataはフェッチされたオブジェクトの変更可能なコピーself.dataであり、の要素を並べ替えても Core Data オブジェクトにはまったく影響しません。

したがって、ビューを変更してこのテーブル ビューに戻ると、すべての要素はプログラムの開始時と同じ (不特定の) 順序になります。

オブジェクトを適切に定義された順序に保つにはsortIndex 、エンティティに属性を追加し、そのキーを使用して並べ替え記述子でオブジェクトをフェッチする必要があります。

sortIndexテーブル ビューで行を再配置するときは、新しい順序が反映されるように属性を更新する必要があります。残念ながら、この目標を達成するための組み込みの方法や「簡単な」方法はありません。

CoreData レコードの並べ替えを実装する方法をご覧ください。詳細については。特に、答えhttps://stackoverflow.com/a/15625897/1187415は有望に見えますが、自分でテストしませんでした。

于 2013-10-20T10:38:42.387 に答える