通过字符串 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 = ".."
注意:这是一个简单但危险的解决方案,因为您可以为多个子视图设置相同的标签
如果我在 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 = ".."
注意:这是一个简单但危险的解决方案,因为您可以为多个子视图设置相同的标签