更改for循环

时间:2017-01-19 08:39:16

标签: ios swift for-loop

我在主视图中添加了一些UIViews,一个在另一个旁边,以编程方式添加,如下所示:

//global variable
var lastLine: UIView!

//inside a function
for(var line = 0; line <= numberOfLines; line++){

        lastLine = UIView(frame: CGRect(x: lengthOfSpace + lengthOfLine * CGFloat(line) + lengthOfSpace * CGFloat(line), y: 8 * view.frame.height/10, width: lengthOfLine, height: 7))
        lastLine.backgroundColor = UIColor.whiteColor()
        lastLine.layer.cornerRadius = lastLine.frame.height/4
        view.addSubview(lastLine)

}

现在我想改变我创建的最后一行的颜色,所以我这样做了:

        lastLine.backgroundColor = UIColor.blueColor()

但是,只要我尝试从for循环外部更改颜色,就不会改变颜色。为什么会这样?有什么方法可以改变线条的颜色吗?

谢谢

2 个答案:

答案 0 :(得分:1)

问题可能围绕如何声明事物(单个视图)与创建它们的方式(潜在的视图数组)。为什么不使用UIView的tag属性来操作你想要更改的特定视图?

假设您有5行/视图,并希望操纵第3行。

创建5个视图的代码:

var numberOfLines:Int = 0

for line in 1...numberOfLines {
    let newView = UIView()
    // code to create and position UIView
    newView.tag = line
    view.addSubview(newView)
}

操纵第三行/视图的代码:

func alterLine(_ lineNumber:Int) {
    for view in view.subviews as [UIView] {
        if view.tag = lineNumber {
            // change view code
        }
    }
}

由于您使用UIViews,您需要注意任何视图可能将其标记属性设置为此行号,甚至是UISlider!为了解决这个问题,您可以继承UIView和LineView,并且alterLine()将是:

func alterLine(_ lineNumber:Int) {
    for view in self.view.subviews as [UIView] {
        if let lineView = view as? LineView {
            if lineView.tag = lineNumber {
                //change LineView code
            }
        }
    }
}

答案 1 :(得分:0)

好吧,那很奇怪 - 因为它适合我。我把你的代码放在一个函数中,如果我在循环中设置backgroundColor,那么每一行都会改变,如果我把它放在循环之外,只有最后一行会改变。

愚蠢的问题,但是你没有指定这些行的大小 - 是否有可能在屏幕上绘制最后一行,以便你看不到它?