Вложенные представления макета не работают должным образом

#uiview #swift

#uiview #swift

Вопрос:

У меня проблемы с пользовательским представлением, которое я разрабатываю. По сути, это таблица, в которой отображаются 12 меток, где верхняя левая метка и нижняя левая метка должны иметь ширину * 5 других представлений. Я уже добавил представления и настроил рамку в вложенных представлениях макета, но метки не отображаются в представлении (уже проверено с помощью отладчика новых представлений Xcode

  override func layoutSubviews() {
    super.layoutSubviews()

    let width = self.frame.size.width
    let height = self.frame.size.height

    let normalWidth = width/10
    let normalHeight = height/2


    var currentOrigin = CGPoint(x: 0, y: 0)

    let nameSize = CGSize(width: normalWidth * 5 - 3, height: normalHeight)

    labels[0][0].frame = CGRect(origin: currentOrigin, size: nameSize)

    currentOrigin.x  = normalWidth

    for j in labels[0]{
        j.frame = CGRect(origin: currentOrigin, size: CGSize(width: normalWidth - 3, height: normalHeight))
        currentOrigin.x  = normalWidth
    }

    currentOrigin.y = normalHeight
    currentOrigin.x = 0
    labels[1][0].frame = CGRect(origin: currentOrigin, size: nameSize)

    for j in labels[1]{
        j.frame = CGRect(origin: currentOrigin, size: CGSize(width: normalWidth - 3, height: normalHeight))
        currentOrigin.x  = normalWidth
    }
}
 

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

  init(frame: CGRect) {
    labels = Array(count:2, repeatedValue:Array(count:6, repeatedValue: UILabel() ))
    super.init(frame: frame)

    for i in 0..labels.count{
        for j in 0..labels[i].count{
            labels[i][j] = UILabel()
            labels[i][j].font = currentFont
            labels[i][j].adjustsFontSizeToFitWidth = true
            labels[i][j].textAlignment = NSTextAlignment.Center
            labels[i][j].text = "HOLA MUNDO"
            addSubview(labels[i][j])
        }
    }

    for i in 0..labels.count{
        if let k = delegate?{
            labels[i][0].text = k.name(i 1)
        }
    }


    for i in 0..labels.count{
        for j in 1..labels[i].count{
            labels[i][j].text = "0"
        }
    }
}
 

Ответ №1:

На случай, если у кого-то возникнут подобные проблемы, вот решение, которое я наконец нашел

  labels = Array(count:2, repeatedValue:Array(count:6, repeatedValue: UILabel() ))
 

Эта строка генерирует 2 массива UILabels, но все элементы массивов указывают на один и тот же экземпляр UILabel . также:

   labels[0] === labels[1] //They will point to the same instance
 

Другая ошибка заключалась в повторении

  for i in 0..labels.count{
    if let k = delegate?{
        labels[i][0].text = k.name(i 1)
    }
}
 

Правильным было выполнить итерацию от 1 до labels.считайте, что первая метка должна была иметь другой размер.

Правильная форма для создания экземпляров массивов следующая:

   for i in 0..2{
        labels.append([UILabel]())
        for j in 0..6{
            labels[i].append(UILabel())
            labels[i][j].font = currentFont
            labels[i][j].adjustsFontSizeToFitWidth = true
            labels[i][j].textAlignment = NSTextAlignment.Center
            labels[i][j].text = "HOLA MUNDO"
                addSubview(labels[i][j])

        }
 

Надеюсь, это поможет вам избежать этой ошибки. Это было действительно трудно найти.