通过字符串 Xcode 标识符访问 UILabel

Accessing a UILabel via string Xcode identifier

如果我在 viewcontroller 上有一个 UILabel,并从 vc 将它连接到我的 swift class:

class RoomScheduleViewController: UIViewController {   
    @IBOutlet weak var bookingLabel8: UILabel!

如何在方法中访问它?像这样:

    let hour = 8
    let labelToChange = "bookingLabel" + String(hour)

//Manipulate label e.g. labeltoChange.text = ".."

还有这样的数组:let

bookingLabelArray : [UILabel] = [bookingLabel8, bookingLabel9, bookingLabel10, bookingLabel11,bookingLabel12]

,打算尝试循环并检查字符串是否等于标识符,但不确定如何执行此操作?

您可以使用 for each 循环执行此操作:

如果我没理解错的话,你想用特定文本捕捉标签,让我们调用特定文本 "your identifier":

bookingLabelArray.forEach { (label) in
        if label.text == "your identifier" {
            // do something with that label.
        }
    }
let hour = int ()
hour = 8

let bookingLabelArray = NSMutableArray()
let labelToChange = UILabel()

for i in 0..<4 // count till you want.. here take 4
{
   labelToChange = "bookingLabel" + String(hour + i)
   bookingLabelArray .add(labelToChange)


   //You can directly check label text
   if labelToChange.text == "yourIdentifier" {
        // do whatever you want.
    }


 // You can check from array
   if((bookingLabelArray.object(at: i) as! String) == "yourIdentifier" {
        // do whatever you want.
    }


}

您可以使用字典将 "hour" 映射到标签,例如

let labels = [8: bookingLabel8, 9: bookingLabel9 /* and so on */]

let hour = 8
if let labelToChange = labels[hour] {
    // do something
} 

无法发表评论,所以我会边提问边回答。

要在方法中访问您的标签,您可以像这样使用标签:

bookingLabel8.text = "..."

但是看到你持有这些标签的数组,我假设你的意思是更新给定标签文本的动态方式。

为此,您可以将标签作为参数传递给方法,如下所示:

func change(label: UILabel, to text: String) {
  label.text = text
}

这样你就可以为你想要的任何标签调用这个函数,并使用循环遍历你的标签并检查你想要更改的标识符:

change(label: bookingLabelArray[0], to: "new text")

但这似乎是一种奇怪的方式,您确定需要这些标签作为静态 UI 组件吗?这似乎更像是 list/collection 视图中动态原型的用例。那里有很多教程,这似乎是一个不错的Prototype Cells

您可以使用 IBOutlet 集合来做到这一点。为此,您需要制作 'outlet collection' 而不是 IBOutlet,例如:

 @IBOutlet weak var bookingLabel: [UILabel]!

以后您可以像数组一样使用索引访问它们。例如:

bookingLabel[8].text = "some text"

要建立出口连接,select 接口构建器中第一个标签的出口集合,并将每个标签连接到该出口。

有关 IBOutlet 集合的更多详细信息,请遵循此 link: Outlet Collections

您不能在运行时编写变量名。

一个可能的解决方案是将标签声明为 IBOutletCollection

@IBOutlet weak var bookingLabels: [UILabel]!

以正确的顺序将 Interface Builder 中的所有标签连接到此插座

然后添加一个方法来获取索引的标签(假设标签8是集合中的第一个标签)

func label(for hour: Int) -> UILabel? { 
   let index = hour - 8
   guard 0..<bookingLabels.count ~= index else { return nil }
   return bookingLabels[index]
}

如果你为标签设置标签,你可以在没有 IBOutlet 的情况下访问标签。 然后你可以这样做:

func label(for hour: Int) -> UILabel? {
    return view.viewWithTag(hour) as? UILabel
}

let hour = 8 // bookingLabel8 needs tag 8
let labelToChange = label(for: hour)
labelToChange?.text = ".."

注意:这是一个简单但危险的解决方案,因为您可以为多个子视图设置相同的标签