2017-04-07 200 views
2

我目前有一个double for-loop,用于创建一个由UIView CGRect方格的X网格。该循环还将网格的每个UIView/Square添加到二维数组,允许我访问网格的每个单元格,并通过循环的索引值更改颜色/定位。Swift 3 - 如何从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,然后删除所有UIViews与100类似的标记值:

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

但是没有运气。我也试图用这个方法:

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

的主要区别我的代码中发现相对于其他民族的答案是,我有“?”和“!”在代码中的地方。我研究了它们的含义并理解了它的大部分内容,但是我仍然不知道如何修复我的代码,因为如果这样做,并且觉得这是问题所在。我所知道的是,试图从超级视图中移除UIViews不起作用,没有“?”和“!”代码根本不运行。

+0

为什么你不创建一个_view_包含所有视图作为你打算删除的子视图......?那么当你需要删除这些视图时,你只需要删除他们的超级视图(或者只是隐藏它) - 这对我来说似乎是一种更简单的方法来处理这种情况,它也不会破坏约束条件 - 如果我找到了你正确。 – holex

+0

这确实像一个更好的解决方案。你能解释一下我会怎么做吗? – Terminal

回答

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") 
     } 
    } 
} 

的例子,是在操场上工作:

​​
+0

现在我正在尝试你的解决方案,但是当我看到'let viewWithTag = self.view.viewWithTag(z)'它告诉我在“view”后添加一个问号成为'let viewWithTag = self.view ?.viewWithTag(z)',当我运行它时,它似乎打印进入IF的两个条件,并且只循环两次,不是“n”个循环,但仍然在屏幕上看到尚未被删除的正方形。 – Terminal

+0

@Terminal我在操场上创建了一个简单示例,以便您可以看到它在简单代码中的工作方式。 –

+0

太棒了!我应该能够把它拆开,看看我的破坏和修复。非常感谢! – Terminal

1

你可能会俯瞰多少,更简单的方法来做到这一点...

已建立的包括引用一个二维数组当你填充你的视图时,可以使用“单元格”。所以,只需使用该数组即可将其删除。

​​3210