Доступ к UILabel через строковый идентификатор Xcode - PullRequest
0 голосов
/ 12 декабря 2018

Если у меня есть UILabel на viewcontroller, и я подключил его к моему быстрому классу с vc:

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]

, собирался попробовать пройтись по циклу и проверить, равна ли строка идентификатору, но не уверен, каксделать это?

Ответы [ 7 ]

0 голосов
/ 12 декабря 2018

Вы не можете составлять имена переменных во время выполнения.

Возможное решение - объявить метки как IBOutletCollection

@IBOutlet weak var bookingLabels: [UILabel]!

Подключите все метки в Интерфейсном Разработчике к этой розетке в соответствующемorder

Затем добавьте метод для получения метки для индекса (при условии, что метка 8 является первой меткой в ​​коллекции)

func label(for hour: Int) -> UILabel? { 
   let index = hour - 8
   guard 0..<bookingLabels.count ~= index else { return nil }
   return bookingLabels[index]
}
0 голосов
/ 12 декабря 2018

Если вы установите метку для меток, вы можете получить доступ к метке без 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 = ".."

ПРИМЕЧАНИЕ: это простое, но опасное решение, потому что вы можете установить один и тот же тег для нескольких подпредставлений

0 голосов
/ 12 декабря 2018

Вы можете сделать это, используя Коллекции IBOutlet.Для этого вам нужно сделать ' outlet collection ' вместо IBOutlet , например:

 @IBOutlet weak var bookingLabel: [UILabel]!

, и позже вы можете получить к ним доступ, используя индекс как массив.Например:

bookingLabel[8].text = "some text"

Чтобы выполнить подключение к розетке, выберите коллекцию розеток для первой метки в конструкторе интерфейса и подключите каждую метку к этой розетке.

Для получения дополнительной информации о коллекциях IBOutlet, следуйтеэта ссылка: Аутлет Коллекции

0 голосов
/ 12 декабря 2018

Не могу комментировать, поэтому я буду задавать вопросы, пытаясь ответить.

Для доступа к метке в методе вы можете просто использовать метку следующим образом:

bookingLabel8.text = "..."

Но учитывая, что у вас есть массив этих меток, я предполагаю, что вы имеете в виду динамический способ обновления текста данной метки.

Для этого вы можете передать метку методу в качестве параметра, например, так:

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

таким образом вы можете вызывать эту функцию для любой метки, которую хотите, и использовать цикл для перебора ваших меток и проверки идентификатора, для которого вы хотите изменить:

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

но это кажется странным способом сделать это, вы уверены, что вам нужны эти метки как статические компоненты пользовательского интерфейса?Похоже, это скорее пример использования динамических прототипов в виде списка / коллекции.Существует множество учебных пособий, которые, кажется, хороши Prototype Cells

0 голосов
/ 12 декабря 2018

Вы можете использовать словарь для сопоставления "часа" с меткой, например,

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

let hour = 8
if let labelToChange = labels[hour] {
    // do something
} 
0 голосов
/ 12 декабря 2018
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.
    }


}
0 голосов
/ 12 декабря 2018

Вы можете сделать это с помощью для каждого цикла:

Если я правильно понимаю, вы хотите поймать метку с определенным текстом, давайте назовем этот определенный текст "вашим идентификатором":

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