いくつかのサブビューを持つ親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];
UIViewクラスドキュメントで気づいたもう1つのこと-最後の文を参照してください。
removeFromSuperviewレシーバーをスーパービューとウィンドウからリンク解除し、レスポンダーチェーンから削除します。
ディスカッション受信者のスーパービューがゼロでない場合、このメソッドは受信者を解放します。ビューを再利用する場合は、このメソッドを呼び出す前にビューを保持し、作業が完了したら、または別のビュー階層に追加した後、適切にリリースするようにしてください。
表示中にこのメソッドを呼び出さないでください。
更新:2014年になり、サブビューを非表示にせずに削除しても完全に機能します。元のポスターのコードはそのまま動作するはずです:
UIView *v = [self.containerView viewWithTag:[n integerValue]];
[v removeFromSuperview];
これにより、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
}
}
Swift 3.0:
let viewToRemove = mySuperView.viewWithTag(myTag)
viewToRemove?.removeFromSuperview()
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() }
}
}
override func viewWillAppear(_ animated: Bool)
{
super.viewWillAppear(animated)
if let topController = UIApplication.topViewController() {
if topController.isKind(of: ProviderHome.self)
{
let arrOfSuview = self.view.subviews
if arrOfSuview.count > 1
{
print("Davender Arr of subviews : \(arrOfSuview)")
for i in 0..<arrOfSuview.count
{
let objSub = arrOfSuview[i]
if objSub.tag == 101
{
objSub.removeFromSuperview()
}
}
}
NotificationCenter.default.addObserver(self, selector: #selector(ProviderHome.handelPushNotification), name: NSNotification.Name(rawValue: "handelPush"), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(ProviderHome.handelLocalNotification), name: NSNotification.Name(rawValue: "handelLocal"), object: nil)
}
}
}
@objc func handelPushNotification(_ notification: NSNotification) {
let arrOfSuview = self.view.subviews
if arrOfSuview.count > 1
{
print("Davender Arr of subviews : \(arrOfSuview)")
for i in 0..<arrOfSuview.count
{
let objSub = arrOfSuview[i]
if objSub.tag == 101
{
objSub.removeFromSuperview()
}
}
}
if notification.userInfo != nil
{
let dict = notification.userInfo as! Dictionary<String, Any>
let d = dict["data"] as! Dictionary<String, Any>
let action = d["gcm.notification.label"] as! String
print("current message id :- ", action)
self.getNotificationId = action
if getNotificationId != ""
{
//call the api for getting Data
AppDelegate.sharedInstance().myCurrentnotificationId = getNotificationId
//working code
let storyboard = UIStoryboard(name: "Provider", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "CommonPopUpsVC") as! CommonPopUpsVC
vc.modalPresentationStyle = .overFullScreen
vc.view.frame = self.view.frame
vc.view.tag = 101
self.view.addSubview(vc.view)
self.present(vc, animated: true, completion: nil)
}
}
}
Cell.contentViewに、削除するサブビューと同じタグがある可能性はありますか? ドキュメント viewWithTagによると、次のものが削除されます:
タグに一致する受信者の階層内のビュー。受信者は検索に含まれます。
この場合、セルからcell.contentViewを誤って削除している可能性があります。 nがゼロで、セルのcontentviewにタグが設定されていない場合、デフォルトで0になり、それが発生します。
それらは単にディスプレイから消えているのですか、それともディスプレイから消えているのですかおよびビュー階層ですか?デバッガーは何を示していますか?
それが正しい一般的な考え方です。消える他のUIView、このUIViewとの関係は何ですか?それらはこのビューのサブビューですか?削除しているビューのdeallocメソッドでdeallocされていますか?
タグは一意ですか?
スジャール