[OK]を私は、私はプログラム的にこの方法を使用した5つのビューを挿入し、このケースを持っている:removeFromSuperview()ビューを初めてから削除されません
let starView = UIImageView(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.width))
// Set Image & Alpha
starView.image = #imageLiteral(resourceName: "star")
starView.alpha = 1
starView.tag = starIndex
// Add to Super View
self.mainView.addSubview(starView)
5つのビューは1,2,3,4をstarIndexあるためということに注意してください、5結果として
これは簡単です。しばらく
イベントが発生したとき、私はこの方法を使用してこれらのビューを削除するには、別の方法を使用します。
func removeOldStars() {
for index in 1...5 {
if let foundView = view.viewWithTag(index) {
foundView.removeFromSuperview()
}
}
}
結果は最後の要素だけで「数5」が除去されることがあるとして、ここで何が起こります。私はいくつかの試行錯誤を試み、この奇妙な行動を見つけました。私がビューを2回のタグ番号を使用して削除すると、それは動作します。たとえば、タグ番号3のビューを削除する場合は、
view.viewWithTag(3).removeFromSuperView()
view.viewWithTag(3).removeFromSuperView()
これは機能します。一度だけあれば何もしません。私は多分ビューが2回追加されたので、それを気付くために2回削除する必要があると思ったが、私はそれをデバッグし、ビューは一度も追加されない。
メインスレッドのビューを削除して、スレッド化していないことが問題ではないことを確認しました。
私は本当にここで起こっていることを理解する必要があるので、これは非常に奇妙なので、あなたの助けに感謝します。
タグを使用しないでください。同じタグ値を持つ別のビューがある可能性があります。 'viewWithTag'が返すものを記録します。私はあなたが単に配列にあなたの5つ星を入れて、あなたはタグを使用する必要はないことをお勧めします – Paulw11
ありがとう@ Paulw11それは働いた!私は前にこれらのタグを使ったことはないと確信しています!!しかし、悪いことは、将来的にそれらを使用して最小化しようとする –
私は@ Paulw11より一歩進んで、決してそれらを使用すると言うだろう。 UIにデータを保持することを奨励します。これは、UIが行うべきこととは正反対です。答えを見ても分かるように、タグを使用するよりも、問題を回避する方法が常に優れています。 – Fogmeister