好的我有这种情况,我使用这种方法以编程方式插入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()
有效!!!如果只是一次它什么都不做。我想也许视图会被添加两次,因此需要将其删除两次以注意它,但我调试它并且没有单次添加视图。
我删除了主线程中的视图,以确保它不是线程问题,不是没有问题。
我很感激你的帮助,因为这太奇怪了我真的需要了解这里发生的事情。
答案 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
}
}