2013-12-10 10 views
7

私のUITableViewには、セルのコレクションがあります。セルをスワイプすると、[削除]ボタンが表示されます。この削除]ボタンをタップすると、次のコードを実行させる:最初のタップは、deleteRowsAtIndexPathsの後に無視されます。

NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft]; 
[self.itemList removeObjectAtIndex:indexPath.row]; 

これは正しくセルがリストから削除されます。ただし、UITableVIewの残りのセルの1つをタップして選択すると、このタップは無視されます(tableView:didSelectRowAtIndexPathは呼び出されません)。もう一度タップすると正しく動作します(つまり、tableView:didSelectRowAtIndexPathが呼び出されます)。

削除後どのセルをタップしても問題ありません。削除後の最初のタップは常に無視され、削除後の2回目のタップは成功します。削除する前

  • 削除は[self.tableView beginUpdates];を呼び出し、削除
  • [self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationFade];を呼び出した後

    • [self.tableView reloadData];を呼び出し、削除
    • self.tableView.editing = NO;を設定し、:

      様々なStackOverflowの回答に基づいて、私が試してみました[self.tableView endUpdates];削除後

    • 上記のすべてを同じタイミングで行うe

    上記のどれも役に立たなかった。削除後の最初のタップは常に無視されます。

    更新: また、上記コードスニペットに[self.itemList removeObjectAtIndex:indexPath.row];コードを追加しました。 マイデータソースデリゲートメソッドは次のようになります。

    -(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { 
        return 1; 
    } 
    
    -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
        return self.itemList.count; 
    } 
    

    上記ボタンのタップに応じてdoDeleteメソッドで呼び出されているコードスニペット([self.deleteButton addTarget:self action:@selector(doDelete) forControlEvents:UIControlEventTouchUpInside];

    UPDATE#2:Lyssaのコメントに基づいて、I以下試してみました:私はすべての私たちのカスタムへの参照ボタンを削除し、私たちのスワイプジェスチャーを削除してから、私たちのUITableViewデリゲートにこのコードを追加:

    -(BOOL) tableView:(UITableView*)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
        return YES; 
    } 
    
    -(void) tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
        if (editingStyle == UITableViewCellEditingStyleDelete) { 
         [self.itemList removeObjectAtIndex:indexPath.row]; 
         [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft]; 
        } 
    } 
    

    仕事をん - 私は今、行を削除することができますし、次のタップは正しく機能します。しかし、これは最初のカスタムコードの目的であったテーブルセルのカスタムルックアンドフィールを削除します。おそらく、私は上記の方法を使用し、代わりに削除ボタンをカスタマイズすることを検討する必要があります(私はいくつかの見た目をしており、まだ良い答えを見つけていません)。

  • +0

    セルを削除した後、numberOfRowsInSection:からcountを減らしますか? – Greg

    +0

    あなたのテーブルビューのデータソースを更新しましたか?削除したセルのデータオブジェクトを削除しましたか? – thorb65

    +0

    あなたはどこにdeleteRowsAtIndexPathを入れましたか? – asjj

    答えて

    0

    感謝を設定することで、それを解決することができます。あなたのご意見は私が問題を追跡するのに役立ちました。

    tableView:shouldHighlightRowAtIndexPathを実装していたことが判明し、削除後に最初の呼び出しでNOを返してから、その後にYESを返していました。これが最初のタップが無視された理由です。当社の完全な問題のコードは、このでした:

    -(BOOL) tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
        if (self.currentPath) { 
         [self resetSelectedCell]; 
         self.currentPath = nil; 
         return NO; 
        } 
        return YES; 
    } 
    

    このコードは、一度に表示されることから、複数の削除ボタンを防止するために設けられましたが、我々は削除した後に正しくself.currentPathをリセットしていませんでした。削除が成功し、コードが正常に動作した後、self.currentPathをnilに設定します。

    4

    スワイプを使用すると、スワイプした行だけが編集モードに入るという問題があります。

    そして、最初のタップは、その行の編集モードを終了します

    - (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath { 
    } 
    

    あなたが編集モードに私の質問への回答やコメントを提供するすべての人へ

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
        if (editingStyle == UITableViewCellEditingStyleDelete) { 
         [self.itemList removeObjectAtIndex:indexPath.row]; 
         [self.tableView setEditing:NO animated:YES]; 
        } 
        [self.tableView reloadData]; 
    } 
    
    +0

    [ドキュメント](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewDataSource_Protocol/index.html#//apple_ref/occ/intfm/UITableViewDataSource/tableView:commitEditingStyle:forRowAtIndexPath: ): "このメソッドの実装では、' setEditing:animated: 'を呼び出すべきではありません。何らかの理由で' performSelector:withObject:afterDelay: 'メソッドを使用して遅延させた後に呼び出す必要があります。 – Shebuka

    関連する問題