2016-09-25 4 views
0

[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回削除する必要があると思ったが、私はそれをデバッグし、ビューは一度も追加されない。

メインスレッドのビューを削除して、スレッド化していないことが問題ではないことを確認しました。

私は本当にここで起こっていることを理解する必要があるので、これは非常に奇妙なので、あなたの助けに感謝します。

+0

タグを使用しないでください。同じタグ値を持つ別のビューがある可能性があります。 'viewWithTag'が返すものを記録します。私はあなたが単に配列にあなたの5つ星を入れて、あなたはタグを使用する必要はないことをお勧めします – Paulw11

+0

ありがとう@ Paulw11それは働いた!私は前にこれらのタグを使ったことはないと確信しています!!しかし、悪いことは、将来的にそれらを使用して最小化しようとする –

+0

私は@ Paulw11より一歩進んで、決してそれらを使用すると言うだろう。 UIにデータを保持することを奨励します。これは、UIが行うべきこととは正反対です。答えを見ても分かるように、タグを使用するよりも、問題を回避する方法が常に優れています。 – Fogmeister

答えて

1

タグは一般に、ビューを参照するための脆弱な方法です。 @ Paulw11が述べたように、これは同じタグ値を持つ他のサブビューの問題である可能性が非常に高いです。 この場合、私はUIImageViewsのインスタンスを保持してから、removeOldStarsメソッドで反復処理を行い、インスタンス上で直接removeFromSuperviewを呼び出します。

//instantiate empty array of UIImageView 
var starViews = [UIImageView]() 

//assuming your add method name.. 
func addStar() { 

    //your code above up to... 

    self.mainView.addSubview(starView) 
    starViews.append(starView)  
} 

func removeOldStars() { 
    for view in starViews { 
     view.removeFromSuperview() 
     //maybe explicitly de allocate the view depending 
    } 
} 
+0

ありがとうございます@シララビクスそれは働いた!私は前にこれらのタグを使ったことはないと確信しています!!しかし、私はそれらを将来的に使うのを最小限にしようとします –

関連する問題