2017-06-21 9 views
1

スーパービューからサブビューを削除して別のVCにプッシュすると、削除されたサブビューがすべてビューに再表示される問題があります。もしviewDidApperでも。事前にスーパービューからの削除が開始された後でもUIViewが再表示される

enter image description here

//HERE IS HOW I ADD VIEWS 

func addusers() { 

    for user in 0...5 { 
     let radarButton = PRButton(frame: CGRect(x: 0, y: 0, width: itemSize.width, height: itemSize.height+14)) 
     radarButton.profileButton?.setImage(UIImage(named: "dummy-avatar.png"), for: UIControlState()) 
     radarButton.profileName.setTitle("test \(user)", for: .normal) 

     repeat { 
      let center = generateCenterPointInRadar() 
      radarButton.center = CGPoint(x: center.x, y: center.y) 

     } while (itemFrameIntersectsInOtherItem(radarButton.frame)) 
     radarButton.profileButton?.addTarget(self, action: #selector(didTapUser), for: .touchUpInside) 
     radarButton.profileName?.addTarget(self, action: #selector(didTapUser), for: .touchUpInside) 
     self.addSubview(radarButton) 
     items.append(radarButton) 
    } 

} 

//HERE IS HOW I REMOVE VIEWS 
func removeAllUsers() { 
    for view in self.subviews { 
     if view is PRButton { 
      view.removeFromSuperview() 
     } 
    } 
    items.removeAll() 

} 
//Remove from superview 
    override func removeFromSuperview() { 

     UIView.beginAnimations("", context: nil) 
     UIView.setAnimationDuration(1) 
     self.alpha = 0 
     UIView.setAnimationDidStop(Selector(("callSuperRemoveFromSuperview"))) 
     UIView.commitAnimations() 

    } 

fileprivate func callSuperRemoveFromSuperview() { 
    super.removeFromSuperview() 
} 

おかげ

+0

ビューが別のビューコンテナ内にないのは確かですか? – Edu

+0

@Eduダウンロードしてチェックできるテストプロジェクトが含まれていることを確信しています –

答えて

1

まず見て事...あなたはremoveFromSuperview()を上書きPRButton

- しかし、あなたの構造が間違っていると、あなたが実際にビューを削除することはありません。

これでそれを置き換えます

override func removeFromSuperview() { 

    UIView.animate(withDuration: 1.0, animations: ({ 
     self.alpha = 0.0 
    }), completion: { _ in 
     self.callSuperRemoveFromSuperview() 
    }) 

} 

あなたは、単にあなたの代わりに追加self.callSuperRemoveFromSuperview()機能のsuper.removeFromSuperview()を呼び出すことができます。

Debug View Hierarchyの機能を知っていれば、すぐにそのことがわかります。

+0

最初にsuper.removeFromSuperView()を呼び出してもいいですか? – Larry

+0

"フェードアウェイ"アニメーションが失われます。彼は '.setAnimationDidStop'セレクタを修正することもできますが、ブロックフォーマットは一般的には(将来の見通しであると考えられます)。 – DonMag

+0

@DonMagありがとう、私はいつも多くの助けた機能のブロックフォーマットを使用しています。:) –

2

私はテストプロジェクトを見ました。 私は

func removeAllUsers() { 
    for view in self.subviews { 
     if view is PRButton { 
      UIView.animate(withDuration: 1, animations: { 
      view.alpha = 0 
      }, completion: { (finished) in 
      view.removeFromSuperview() 
      }) 
     } 
    } 
    items.removeAll() 

} 

)私は問題を発見し、それは私が(それをコメントアウトしてremoveAllUsersを編集override func removeFromSuperview() でだったと思う、私は戻ってviewController

にしていながら、今、私は重複ユーザーが表示されません
+0

ありがとう、removeFromSuperview()を修正して私の問題を解決しました –

関連する問題