removeFromSuperview()视图未从第一次删除

时间:2016-09-25 21:30:16

标签: ios swift autolayout

好的我有这种情况,我使用这种方法以编程方式插入5个视图:

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个视图的starIndex为1,2,3,4,5

这是直截了当的。

在事件发生一段时间后,我使用另一种方法使用此方法删除这些视图:

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

这里发生的结果是删除了最后一个元素“number 5”。我尝试了几次试错,发现了这种奇怪的行为。当我使用标签号删除视图两次时,它可以正常工作。例如,如果我想删除带有标签号3的视图,如果我写

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

有效!!!如果只是一次它什么都不做。我想也许视图会被添加两次,因此需要将其删除两次以注意它,但我调试它并且没有单次添加视图。

我删除了主线程中的视图,以确保它不是线程问题,不是没有问题。

我很感激你的帮助,因为这太奇怪了我真的需要了解这里发生的事情。

1 个答案:

答案 0 :(得分: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
    }
}