1

このメソッドを使用してすべてのサブビューを取得しようとしましたが、アプリケーションを実行すると、割り当て解除されたインスタンスエラーにメッセージが送信されます。

subviewsArray = self.view.subviews;
for (int i=0; i <subviewsArray.count; i++) {
    UIView *subview = [subviewsArray objectAtIndex:i];
    if (subview.tag >= 0) {
        [subview removeFromSuperview];
    }
}

そして私の.hで

@property (nonatomic, strong) NSArray *subviewsArray;
4

5 に答える 5

6

ループ コードを次のように変更します。

for (int i=subviewsArray.count - 1; i >= 0; --i) {
    UIView *subview = [subviewsArray objectAtIndex:i];
    if (subview.tag >= 0) {
        [subview removeFromSuperview];
    }
}

この問題が発生する理由は、ループが 0 から 10 番目 (最後と仮定) のビューに進むにつれて、それらを親ビューから削除し始めるため、カウントも変更され、残りのビューのインデックスが変更されるためです。

最後に、ビューを削除してメッセージremoveFromSuperviewを送信しようとすることになりますが、これはすべてインデックスの変更が原因で、既に割り当てが解除されています。最後のインデックスから最初に、逆方向に移動することをお勧めします。

驚いたことに、インデックスが範囲外の例外を取得しなかったのはなぜですか。

ここだけでなく、一般に、インデックスに基づいてコレクションをトラバースして要素を削除しようとすると、常にこの問題に直面します。

于 2012-07-10T13:23:09.817 に答える
2

ループ コードを次のように変更します。

subviewsArray = self.view.subviews;
for (int i=0; i <subviewsArray.count - 1; i++) {
    UIView *subview = [subviewsArray objectAtIndex:i];
    if (subview.tag >= 0) {
        [subview removeFromSuperview];
    }
}
于 2012-07-10T13:15:50.673 に答える
1

これを試して:

for(UIView *temp in self.view.subviews )
{
    [temp removeFromSuperview];
}

またはこれ:

[self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

お役に立てれば。

乾杯!

于 2012-07-10T13:14:13.323 に答える
1
 self.subviewsArray = self.view.subviews;
for (int i=0; i <self.subviewsArray.count - 1; i++) {
    UIView *subview = [self.subviewsArray objectAtIndex:i];
    if (subview.tag >= 0) {
        [subview removeFromSuperview];
    }
}
于 2012-07-10T13:14:31.213 に答える
1

最初はARCが原因だったのかもしれませんが、forループを単純化することでこれを修正できるかもしれません

for (UIView *subview in self.subviews)
{

}   
于 2012-07-10T13:15:45.920 に答える