5

部分的な出力しか取得できませんでした。ドラッグ アンド ドロップの主な機能は達成されましたが、何度かクラッシュし、範囲外のインデックスとしてエラーが表示されました。

パン ジェスチャ コントローラーを使用して UITableView セルをドラッグ アンド ドロップします。

これは私のサンプルコードです

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    pathNumber=indexPath.row;
    cell = [tableView cellForRowAtIndexPath:indexPath];
    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panDetected:)];
    [cell addGestureRecognizer:panRecognizer];


    if (cell.accessoryType==UITableViewCellAccessoryNone)
    {

        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        if(tableView==tableView1)
        {
            [selectedCells addObject:[array objectAtIndex:indexPath.row]];
            NSLog(@"indexpath-%d",indexPath.row);
            [arrayOfPaths addObject:indexPath];
            NSLog(@"----%@",selectedCells);
            NSLog(@"----======%@",arrayOfPaths);
        }
        else
        {
            [selectedCells1 addObject:[array1 objectAtIndex:indexPath.row]];
            NSLog(@"indexpath-%d",indexPath.row);
            [arrayOfPaths1 addObject:indexPath];
            NSLog(@"====%@",selectedCells1);
            NSLog(@"----======]]]]]%@",arrayOfPaths1);
        }
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
        if(tableView==tableView1)
        {
            [selectedCells removeObject:[array objectAtIndex:indexPath.row]];
            [arrayOfPaths removeObject:indexPath];
            NSLog(@"----%@",selectedCells);
            NSLog(@"----======remove%@",arrayOfPaths);
        }
        else
        {
            [selectedCells1 removeObject:[array1 objectAtIndex:indexPath.row]];
            [arrayOfPaths1 removeObject:indexPath];
            NSLog(@"====%@",selectedCells1);
            NSLog(@"----======remove1%@",arrayOfPaths1);
        }
    }
}

- (void)panDetected:(UIPanGestureRecognizer *)panRecognizer
{
    CGPoint translation = [panRecognizer translationInView:self.view];
    CGPoint cellViewPosition = cell.center;
    cellViewPosition.x += translation.x;
    cellViewPosition.y += translation.y;

    cell.center = cellViewPosition;
    [self.view bringSubviewToFront:cell];
    [panRecognizer setTranslation:CGPointZero inView:self.view];
    NSArray * arr=[NSArray arrayWithObject:[NSIndexPath indexPathForRow:pathNumber inSection:0]];
    NSArray * arr1=[NSArray arrayWithObject:[NSIndexPath indexPathForRow:pathNumber inSection:0]];

    if(panRecognizer.state==UIGestureRecognizerStateBegan)
    {
        position1=[panRecognizer locationInView:self.view];
    }
    if(panRecognizer.state==UIGestureRecognizerStateEnded)
    {
        position = [panRecognizer locationInView:self.view];

        NSLog(@"%f %f",position.x,position.y);

        if(CGRectContainsPoint(tableView2.frame, position))
        {
            NSLog(@"1-2");
            if(position.x>=tableView2.frame.origin.x && position1.x >= tableView1.frame.origin.x  && position1.x <= tableView1.frame.size.width)
            {
                if([selectedCells count] ==1)
                {
                    [tableView2 beginUpdates];
                    [tableView2 insertRowsAtIndexPaths:arr1 withRowAnimation:UITableViewRowAnimationTop];
                    [array1 insertObject:[array objectAtIndex:pathNumber] atIndex:pathNumber];
                    d=[array1 count];
                    [tableView2 endUpdates];

                    [tableView1 beginUpdates];
                    [tableView1 deleteRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationTop];
                    [array removeObjectAtIndex:pathNumber];
                    c=[array count];
                    [tableView1 endUpdates];
                }
                else
                {
                    [tableView2 beginUpdates];
                    [tableView2 insertRowsAtIndexPaths:arrayOfPaths withRowAnimation:UITableViewRowAnimationTop];
                    for(int j=0;j<[arrayOfPaths count];j++)
                    {
                        NSIndexPath * tempIndexPath = (NSIndexPath *)([arrayOfPaths objectAtIndex:j]);
                        [array1 insertObject:[selectedCells objectAtIndex:j] atIndex:tempIndexPath.row];
                    }
                    d=[array1 count];
                    NSLog(@"%d", d);
                    [tableView2 endUpdates];

                    [tableView1 beginUpdates];

                    [tableView1 deleteRowsAtIndexPaths:arrayOfPaths withRowAnimation:UITableViewRowAnimationTop];
                    for(int j = 0;j < [arrayOfPaths count]; j++)
                    {
                        NSIndexPath * temp = (NSIndexPath *)[arrayOfPaths objectAtIndex:j];
                        [array removeObjectAtIndex:temp.row];
                    }
                    c=[array count];
                    [tableView1 endUpdates];


                }
                [selectedCells removeAllObjects];
                [arrayOfPaths removeAllObjects];
            }
            else
            {
                NSLog(@"else");
            }

        }

        else if(CGRectContainsPoint(tableView1.frame, position))
        {
            NSLog(@"hi-2");
            if(position.x>=tableView1.frame.origin.x && position1.x >= tableView2.frame.origin.x  && position1.x <= tableView2.frame.size.width + tableView2.frame.origin.x)
            {
                if([selectedCells1 count] == 1)
                {
                    [tableView1 beginUpdates];
                    [tableView1 insertRowsAtIndexPaths:arr1 withRowAnimation:UITableViewRowAnimationTop];
                    [array insertObject:[array1 objectAtIndex:pathNumber] atIndex:pathNumber];
                    c=[array count];
                    [tableView1 endUpdates];

                    [tableView2 beginUpdates];
                    [tableView2 deleteRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationTop];
                    [array1 removeObjectAtIndex:pathNumber];
                    d=[array1 count];
                    [tableView2 endUpdates];
                }
                else
                {
                    [tableView1 beginUpdates];
                    [tableView1 insertRowsAtIndexPaths:arrayOfPaths1 withRowAnimation:UITableViewRowAnimationTop];
                    for(int j=0;j<[arrayOfPaths1 count];j++)
                    {
                        NSIndexPath * tempIndexPath = (NSIndexPath *)([arrayOfPaths1 objectAtIndex:j]);
                        [array insertObject:[selectedCells1 objectAtIndex:j] atIndex:tempIndexPath.row];
                    }
                    c=[array count];
                    NSLog(@"%d", c);
                    [tableView1 endUpdates];

                    [tableView2 beginUpdates];

                    [tableView2 deleteRowsAtIndexPaths:arrayOfPaths1 withRowAnimation:UITableViewRowAnimationTop];
                    for(int j = 0;j < [arrayOfPaths1 count]; j++)
                    {
                        NSIndexPath * temp = (NSIndexPath *)[arrayOfPaths1 objectAtIndex:j];
                        [array1 removeObjectAtIndex:temp.row];
                    }
                    d=[array1 count];
                    [tableView2 endUpdates];

                }
                [selectedCells1 removeAllObjects];
                [arrayOfPaths1 removeAllObjects];

            }
            else
            {
                NSLog(@"else1");
            }
        }
    }

}
4

2 に答える 2

0

触れているセルを取得できます。そのセルがあれば、「.h」で宣言する必要がある一時セルに値を保存し、最初のテーブルのデータ ソースから削除できます。

タッチが終了したことを検出したときに、そのタッチがいずれかのテーブルで終了した場合は、一時セルをその dataSource に追加し、reloadData を作成します。それ以外の場合、タッチがテーブル境界のいずれかで終了しなかった場合は、一時セルを元のテーブルに追加します。

視覚的な機能を向上させるために、タッチ座標で UITableViewCell を表示できます。

だから、一歩一歩:

  • ViewController で次のように宣言します。UITableviewCell * tempCell

  • コードのどこかでその「tempCell」を初期化しますtempCell = [[UITableViewCell alloc]init]

  • その方法で - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { //Here you have selected row number; } は、選択した行を取得できるため、データ ソースからセル値を復元できます。その値を「tempCell」に保存し、テーブルのデータソースから削除します。

  • タッチ中にセルを表示したい場合は、ViewController.view に UITableViewCell を追加できます。

  • タッチ- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;座標を取得します。これらの座標を使用して、それらがテーブルの 1 つにあるかどうかを確認できます。座標がテーブルの 1 つに属している場合は、それらのデータ ソースに追加し、「tempCell」を消去して (ViewController のビューに表示されていた場合は cellView を削除して)、最後に[tableView reloadData];. または、座標がテーブルに属していない場合は、セルを元のデータソースに追加し、「tempCell」を消去します。

私の悪い英語でごめんなさい:(

于 2014-03-20T16:54:47.107 に答える