2016-09-25 37 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它工作!虽然我确信我从未使用过这些标签!不过,我会尽量减少将来使用它们 –

相关问题