40

多数のサブビューを持つ親 UIView があります。定期的にサブビューを削除し、システムから完全に削除する必要があります。これを行う正しい方法は何ですか?私はこれを試しました:

UIView *v = [self.containerView viewWithTag:[n integerValue]];

[v removeFromSuperview];

そして奇妙な結果を得た。以前存在UIViewしていた s も同様に消えました。どうしたの?

4

8 に答える 8

72

これを試して:

UIView *v = [self.containerView viewWithTag:[n integerValue]];
v.hidden = YES;
[self.containerView bringSubviewToFront:v];
[v removeFromSuperview];

もう 1 つ、UIView クラス ドキュメントから気付いたことがあります。最後の文を参照してください。

removeFromSuperview スーパービューとウィンドウからレシーバーのリンクを解除し、レスポンダー チェーンから削除します。

  • (void)removeFromSuperview

考察 レシーバーのスーパービューが nil でない場合、このメソッドはレシーバーを解放します。ビューを再利用する場合は、このメソッドを呼び出す前にビューを保持し、使用が終了したとき、またはビューを別のビュー階層に追加した後に、必要に応じて解放してください。

表示中はこのメソッドを呼び出さないでください。

更新: 現在は 2014 年であり、サブビューを非表示にせずに削除すると、完全に正常に機能します。元の投稿者のコードはそのまま動作するはずです:

UIView *v = [self.containerView viewWithTag:[n integerValue]];
[v removeFromSuperview];

これにより、v と v にサブビューとしてアタッチされたすべてのビューが削除され、containerView と v の兄弟が残ります。

于 2009-10-06T06:23:58.493 に答える
40

ビューからすべてのサブビューを削除するには:

for(UIView *subview in [view subviews]) {
   [subview removeFromSuperview];
}

特定のビューのみを削除する場合は、次のようにします。

for(UIView *subview in [view subviews]) {
  if([subview isKindOfClass:[UIButton class]]) {
     [subview removeFromSuperview];
 } else {
     // Do nothing - not a UIButton or subclass instance
 }
}

タグ値でサブビューを削除することもできます:

for(UIView *subview in [view subviews]) {
    if(subview.tag==/*your subview tag value here*/) {
        [subview removeFromSuperview];

    } else {
        // Do nothing - not a UIButton or subclass instance
    }
}
于 2012-08-03T06:43:12.487 に答える
0

cell.contentView に、削除したいサブビューと同じタグが付いている可能性はありますか? ドキュメントによると、viewWithTag は以下を削除します。

タグに一致するレシーバーの階層内のビュー。レシーバーが検索に含まれます。

この場合、セルから cell.contentView を誤って削除している可能性があります。n がゼロで、セルの contentview にタグが設定されていない場合、デフォルトで 0 になり、それが発生します。

于 2009-10-06T06:02:45.870 に答える
0

それらはディスプレイから消えているだけですか、それともディスプレイビュー階層から消えていますか? デバッガーは何を表示しますか?

于 2009-10-04T17:47:22.350 に答える
0

それは正しい一般的な考えです。消える他の UIView は、この UIView との関係は何ですか? それらはこのビューのサブビューですか? それらは、削除するビューの dealloc メソッドで解放されていますか?

あなたのタグは一意ですか?

スジャル

于 2009-10-04T13:55:59.783 に答える
0

Swift 4: UIView を拡張する

extension UIView {
    public func removeAllSubviews() {
        for subview in self.subviews {
            subview.removeFromSuperview()
        }
    }
}

また

extension UIView {
    public func removeAllSubviews() {
        self.subviews.forEach { $0.removeFromSuperview() }
    }
}
于 2018-06-21T09:39:33.870 に答える