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

时间:2018-12-12 09:12:08

标签: ios swift storyboard uilabel

如果我在UILabel上有一个viewcontroller,并已从vc将其连接到我的swift班级:

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

如何通过一种方法访问它?像这样:

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

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

还有一个像这样的数组:让

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

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

7 个答案:

答案 0 :(得分:1)

您可以使用字典将“小时”映射到标签,例如

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

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

答案 1 :(得分:1)

无法发表评论,所以我会在尝试回答时提出问题。

要通过一种方法访问标签,您可以像这样使用标签:

bookingLabel8.text = "..."

但是看到拥有这些标签的数组时,我认为您的意思是一种动态更新给定标签文本的方法。

为此,您可以将标签作为参数传递给方法,就像这样:

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

这样,您可以为所需的任何标签调用此函数,并使用循环遍历标签并检查要更改的标识符:

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

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

答案 2 :(得分:1)

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

可能的解决方案是将标签声明为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]
}

答案 3 :(得分:0)

您可以为每个循环使用a:

如果我理解正确,那么您想用特定的文本来捕捉标签,那么就可以将该特定的文本称为“您的标识符”:

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

答案 4 :(得分:0)

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.
    }


}

答案 5 :(得分:0)

您可以使用IBOutlet集合进行此操作。为此,您需要制作“ 插座集合”而不是 IBOutlet ,例如:

 @IBOutlet weak var bookingLabel: [UILabel]!

,随后您可以使用索引(如数组)访问它们。例如:

bookingLabel[8].text = "some text"

要建立插座连接,请从界面构建器中为第一个标签选择插座集合,然后将每个标签连接到该插座。

有关IBOutlet集合的更多详细信息,请访问以下链接: Outlet Collections

答案 6 :(得分:0)

如果为标签设置标签,则无需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 = ".."

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