多数のサブビューを持つ親 UIView があります。定期的にサブビューを削除し、システムから完全に削除する必要があります。これを行う正しい方法は何ですか?私はこれを試しました:
UIView *v = [self.containerView viewWithTag:[n integerValue]];
[v removeFromSuperview];
そして奇妙な結果を得た。以前存在UIView
していた s も同様に消えました。どうしたの?
多数のサブビューを持つ親 UIView があります。定期的にサブビューを削除し、システムから完全に削除する必要があります。これを行う正しい方法は何ですか?私はこれを試しました:
UIView *v = [self.containerView viewWithTag:[n integerValue]];
[v removeFromSuperview];
そして奇妙な結果を得た。以前存在UIView
していた s も同様に消えました。どうしたの?
これを試して:
UIView *v = [self.containerView viewWithTag:[n integerValue]];
v.hidden = YES;
[self.containerView bringSubviewToFront:v];
[v removeFromSuperview];
もう 1 つ、UIView クラス ドキュメントから気付いたことがあります。最後の文を参照してください。
removeFromSuperview スーパービューとウィンドウからレシーバーのリンクを解除し、レスポンダー チェーンから削除します。
考察 レシーバーのスーパービューが nil でない場合、このメソッドはレシーバーを解放します。ビューを再利用する場合は、このメソッドを呼び出す前にビューを保持し、使用が終了したとき、またはビューを別のビュー階層に追加した後に、必要に応じて解放してください。
表示中はこのメソッドを呼び出さないでください。
更新: 現在は 2014 年であり、サブビューを非表示にせずに削除すると、完全に正常に機能します。元の投稿者のコードはそのまま動作するはずです:
UIView *v = [self.containerView viewWithTag:[n integerValue]];
[v removeFromSuperview];
これにより、v と v にサブビューとしてアタッチされたすべてのビューが削除され、containerView と v の兄弟が残ります。
ビューからすべてのサブビューを削除するには:
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
}
}
cell.contentView に、削除したいサブビューと同じタグが付いている可能性はありますか? ドキュメントによると、viewWithTag は以下を削除します。
タグに一致するレシーバーの階層内のビュー。レシーバーが検索に含まれます。
この場合、セルから cell.contentView を誤って削除している可能性があります。n がゼロで、セルの contentview にタグが設定されていない場合、デフォルトで 0 になり、それが発生します。
それらはディスプレイから消えているだけですか、それともディスプレイとビュー階層から消えていますか? デバッガーは何を表示しますか?
それは正しい一般的な考えです。消える他の UIView は、この UIView との関係は何ですか? それらはこのビューのサブビューですか? それらは、削除するビューの dealloc メソッドで解放されていますか?
あなたのタグは一意ですか?
スジャル
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() }
}
}