更改在 for 循环中创建的 UIView 的属性



我在主视图中添加了一些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 循环之外更改它,这些行都不会改变颜色。为什么会这样?有什么方法可以更改线条的颜色吗?

谢谢

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

假设您有 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
            }
        }
    }
}

嗯,这很奇怪 - 因为它对我有用。 我把你的代码放在一个函数中,如果我在循环中设置背景颜色,那么每一行都会改变,如果我把它放在循环之外,只有最后一行会改变。

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

最新更新