使用循环更新重复 UILabel 的值

Update value for a repeating UILabel with loop

我有一些标签可以保存数组的名称和值 items = [MyItems]()。其中

struct MyItems {
    name: String!
    value: Int!
}

标签是titleLabel1valueLabel1。我有 6 个这样的标签,它们从具有超过 6 个值的数组中获取一个值。

目前我正在使用 for 循环,例如:

var items = [MyItems]()
func viewDidLoad() {
    super.viewDidLoad()
    items = loadItemsFromAPI()
    populateFields()
}
func populateFields() {
    for var i = 0; i < 6 && i < items.count; i++ {
      switch i {
           case 0:
               titleLabel1.text = items[i].name
               valueLabel1.text = "items[i].value"
           case 1:
               titleLabel1.text = items[i].name
               valueLabel1.text = "items[i].value"
           case 2:
               titleLabel1.text = items[i].name
               valueLabel1.text = "items[i].value"                
           case 3:
               titleLabel1.text = items[i].name
               valueLabel1.text = "items[i].value"
           case 4:
               titleLabel1.text = items[i].name
               valueLabel1.text = "items[i].value"   
           case 5:
               titleLabel1.text = items[i].name
               valueLabel1.text = "items[i].value"  
           default:
               print("Unexpected value encounteredValue: \(i)")
               break
           }
      }
}

我的问题是有没有什么方法可以遍历标签来分配值而不是这种冗长的方法?

喜欢

for var i = 0; i < 6; i++ {
    titleLabel + "i-1".text = items[i].name
}

理论上,这就是我的想法,前提是可以有一个简短的更简洁的代码。

如果您尝试遍历多个标签并更改它们的值,您可能想试试这个:

var i = 0
for view in self.view.subviews {
    if view is UILabel {
        titleLabel.text = items[i]
        valueLabel.text = items[i]
        i++
    }
}

或者,如果您尝试多次快速更新 1 个标签的文本,您应该使用 NSTimer:

NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "update", userInfo: nil, repeats: true)

var i = 0
func update() {
    labels.text = items[i]
    i++
}

将标签放入数组中:

let titleCollection = [titleLabel1, titleLabel2, titleLabel3, titleLabel4, titleLabel5, titleLabel6]
let valueCollection = [valueLabel1, valueLabel2, valueLabel3, valueLabel4, valueLabel5, valueLabel6]

使用 zip 将文本安全地添加到标签:

zip(titleCollection, items).forEach { [=11=].0.text = [=11=].1.name }
zip(valueCollection, items).forEach { [=11=].0.text = String([=11=].1.value) }

您应该使用 @IBOutlet 的集合,或者将文本字段放在一个数组中。我相信有一种方法可以使用 String 访问您的属性,但从我读到的内容来看,它不可靠或不是故意的,所以我不建议您这样做。如果我错了,请纠正我。