Swift 3 - 如何从Superview以及数组

时间:2017-04-07 10:50:52

标签: ios arrays swift uiview

我目前有一个双循环,用于创建UIView CGRect正方形的X×Y网格。循环还将网格的每个UIView / Square添加到2D数组中,允许我访问网格的每个Cell,并通过循环的索引值改变颜色/定位。

循环似乎工作正常并完美显示单元格/正方形,但是过了一段时间我想要删除所有正方形并清空数组(但不是完全删除)以为新的下一个网格腾出空间(其中可能是不同的大小)。我创建了一个从superview中删除所有视图的函数。

这就是我创建网格的每个“单元格”并将每个单元放入2D数组的方式:

let xStart = Int(size.width/2/2) - ((gridSizeX * gridScale)/2)
let yStart = Int(size.height/2/2) - ((gridSizeY * gridScale)/2)

let cell : UIView!
cell = UIView(frame: CGRect(x: xStart + (xPos * gridScale), y:yStart + (yPos * gridScale), width:gridScale, height:gridScale))

cell.layer.borderWidth = 1
cell.layer.borderColor = UIColor(red:0.00, green:0.00, blue:0.00, alpha:0.02).cgColor
cell.backgroundColor = UIColor(red:1.00, green:1.00, blue:1.00, alpha:0)

cell.tag = 100

self.view?.addSubview(cell)

gridArray[xPos][yPos] = cell

正在应用程序加载上创建2D数组,如下所示:

gridArray = Array(repeating: Array(repeating: nil, count: gridSizeY), count: gridSizeX)

我试图搜索从superview中删除UIViews的解决方案,但是其他问题的所有答案似乎对我都不起作用。我尝试将cell.tag = 100添加到每个UIView,然后删除所有标记值为100的UIViews,如:

for subview in (self.view?.subviews)! {
    if (subview.tag == 100) {
        subview.removeFromSuperview()
    }
}

然而没有运气。我也尝试过使用这种方法:

self.view?.subviews.forEach({
    $0.removeConstraints($0.constraints)
    $0.removeFromSuperview()
})

我在代码中注意到与其他人的答案相比的主要区别是我有“?”和“!”在代码中的位置。我研究了它们的含义并理解了大部分内容但是我仍然不知道如何修复我的代码,因为如果它,并且觉得这就是问题。我所知道的是,从superview中删除UIViews的尝试不起作用,没有“?”和“!”代码根本不运行。

2 个答案:

答案 0 :(得分:3)

如何为您正在使用的每个单元格创建标记:

    //Init value for for the tag.
    var n = 0

    func prepareCell() -> UIView {
             let xStart = Int(size.width/2/2) - ((gridSizeX * gridScale)/2)
             let yStart = Int(size.height/2/2) - ((gridSizeY * gridScale)/2)

         let cell : UIView!
         cell = UIView(frame: CGRect(x: xStart + (xPos * gridScale), y:yStart + (yPos * gridScale), width:gridScale, height:gridScale))

         cell.layer.borderWidth = 1
         cell.layer.borderColor = UIColor(red:0.00, green:0.00, blue:0.00, alpha:0.02).cgColor
         cell.backgroundColor = UIColor(red:1.00, green:1.00, blue:1.00, alpha:0)

        cell.tag = n

        //Each cell should have new value
        n += 1

        return cell
}

现在删除所需的视图。

func removeViews() {
    for z in 0...n {
        if let viewWithTag = self.view.viewWithTag(z) {
           viewWithTag.removeFromSuperview()
        }
        else {
           print("tag not found")
        }
    }
}

在操场上工作的示例:

var n = 0

let mainView = UIView()

func createView() -> UIView {
    let view = UIView()
    view.tag = n
    n += 1
    return view
}

for i in 0...16 {
    mainView.addSubview(createView())
}

func removeViews() {
    for z in 0...n {
        if let viewWithTag = mainView.viewWithTag(z) {
            viewWithTag.removeFromSuperview()
             print("removed")
        }
        else {
            print("tag not found")
        }
    }
}

答案 1 :(得分:1)

你可能会忽略一种更简单的方法来做到这一点......

在填充视图时,您已构建了一个包含对“单元格”的引用的2D数组。所以,只需使用该数组即可将其删除。

// when you're ready to remove them
for subArray in gridArray {
    for cell in subArray {
        cell.removeFromSuperview()
    }
}

// clear out the Array
gridArray = Array<Array<UIView>>()