0

scrollView内のビューの削除をアニメーション化しようとしています。scrollViewのサブビューは、オブジェクトの配列から入力されています。各オブジェクトには、それを表すビューがあります。削除すると、indexOutOfBounds例外が発生することがあります。これは私の削除コードです:

-(void)deleteView:(UIView *)viewToDelete{
    [self.myObjects removeObjectAtIndex:viewToDelete.tag];
    [UIView animateWithDuration:0.5 animations:^{
        viewToDelete.alpha = 0.0;
        for (NSInteger index = viewToDelete.tag+1; index<self.myViews.count; index++){
            UIView *view = [self.myViews objectAtIndex:index];
            view.center = CGPointMake(view.center.x,view.center.y-viewToDelete.frame.size.height);
        }
    }]; completion:^(BOOL finished) {
        [view removeFromSuperview];
    }];

    [self.myViews removeObjectAtIndex:viewToDelete.tag];
    for (NSInteger index=0; index<self.myVies.count; index++){
        UIView *view = [self.myViews objectAtIndex:index];
        view.tag = index;
    }

}
4

2 に答える 2

1

問題はアニメーションブロックにあります

アニメーションブロックが非同期で処理されていることを知っておく必要があります。そのため、アニメーションプロセス中に最後のコードが呼び出され、アニメーションブロック内の反復ループが混乱する可能性があります。あなたは移動する必要があります

[self.myViews removeObjectAtIndex:viewToDelete.tag];
for (NSInteger index=0; index<self.myVies.count; index++){
    UIView *view = [self.myViews objectAtIndex:index];
    view.tag = index;
}

完了ブロックへ

于 2013-03-06T13:04:42.823 に答える
0

この時点でエラーが発生します[self.myObjects removeObjectAtIndex:viewToDelete.tag];

配列から1つのオブジェクトを削除するとすぐに、アイテムの総数が減少します。したがって、そのインデックスのオブジェクトにアクセスすることはできません。

これらの2つの配列self.myObjectsとself.myViewsを実際にマップする必要があります。

于 2013-03-06T12:51:48.223 に答える