10

ユーザーがセルを削除したいときに UITableView を更新するメソッドを作成しました。

-(void)removeMoreFriendsRow:(NSNotification *)notification {
NSDictionary *d = [notification userInfo];
NSIndexPath *index = [d objectForKey:@"indexPath"];
    
[self.p_currentFriends removeObjectAtIndex:index.row];
    
[self.o_table deleteRowsAtIndexPaths:[NSArray arrayWithObject:index] withRowAnimation:UITableViewRowAnimationRight];
}

p_currentFriends は、UITableView によって出力されるすべてのオブジェクトを含む NSMutableArray です。

この方法は、1 回使用すると問題なく動作しますが、複数回使用すると失敗します。

deleteRowsAtIndexPaths の各呼び出しで indexPath が同じままであるように見えます。

例えば、

  • 最初の呼び出しで、ユーザーは 2 番目のセル (indexPath = [0,1]) をタップし、正しいセルが削除されます。
  • 2 番目の呼び出しで、ユーザーは 3 番目のセルをタップし、indexPath = [0,2] ではなく [0,3] にします。

それを機能させる唯一の方法は reloadData を使用することですが、セルの削除にアニメーションを付けたいです。

これどうやってするの?

4

6 に答える 6

9

あなたがしていることは基本的に正しいですが、tableViewどういうわけかリロードする必要があります。全体をリロードしたくない場合はtableView、これを使用してくださいanimation

NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:sectionNum];
[self.o_table reloadSections:indexSet 
            withRowAnimation:UITableViewRowAnimationFade];
于 2012-11-12T15:33:28.127 に答える
5

スイフト 2.2

私が見つけた最善の解決策は、 を設定してNSTimer0.5 秒後にリロード データを呼び出すことです。これにより、アニメーションが終了するのに十分な時間が与えられます。Selector("loadData")を含むメソッドです 。tableview.reloadData()

_ = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("loadData"), userInfo: nil, repeats: false)

スイフト3.0

_ = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(ViewController.loadData), userInfo: nil, repeats: false)
于 2016-01-12T02:03:34.743 に答える
0

delteRowsAtIndexPaths:およびその他のテーブル編集操作をbeginUpdatesendUpdatesで囲む必要があります。それはあなたの問題を解決するかもしれません。

于 2012-11-12T15:20:39.657 に答える
0

上記の回答を参照してください。私の解決策は次のとおりです。

- (void)deleteRowAtIndex:(NSIndexPath *)indexPath{
    [self.dataSource.datas removeObjectAtIndex:indexPath.row];

    [self.tableView beginUpdates];
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationBottom];
    [self.tableView endUpdates];
    //    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:indexPath.section];
    //    [self.tableView reloadSections:indexSet
    //                  withRowAnimation:UITableViewRowAnimationNone];
    //    [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];
    NSLog(@"INDEXPATH:%@",indexPath);
    [NSTimer scheduledTimerWithTimeInterval:0.5 target:self.tableView selector:@selector(reloadData) userInfo:nil repeats:NO];
}
于 2016-04-13T06:02:51.140 に答える