2016-09-25 51 views
0

確定我有這樣的情況下我插入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) 

請注意,starIndex爲5次是1,2,3,4 ,5因此

它很簡單。

當一個事件發生一段時間後,我用另一種方法來刪除使用這種方法,這些觀點:

func removeOldStars() { 
    for index in 1...5 { 
    if let foundView = view.viewWithTag(index) { 
     foundView.removeFromSuperview() 
    } 
    } 
} 

的結果是最後一個元素只有「5號」被刪除這裏會發生什麼。我試了幾次試驗和錯誤,發現了這種奇怪的行爲。當我使用它的標籤號碼刪除視圖兩次。因此,舉例來說,如果我想與標籤號碼3刪除視圖如果我寫

view.viewWithTag(3).removeFromSuperView() 
view.viewWithTag(3).removeFromSuperView() 

它的工作原理!如果只是一次,它什麼都不做。我想也許視圖被添加兩次,所以它需要刪除兩次才能注意到,但我調試了它,並沒有添加視圖單次。

我刪除了主線程中的視圖,以確保它的非線程問題不是沒有問題。

我會感謝您的幫助,因爲這太奇怪了,我真的需要了解這裏發生了什麼。

+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

謝謝@syllabix它工作!雖然我確信我從未使用過這些標籤!不過,我會盡量減少將來使用它們 –

相關問題