Swift: программно добавить несколько стеков один под другим через цикл - PullRequest
0 голосов
/ 24 октября 2019

У меня есть контроллер представления, созданный в раскадровке, и он содержит (проверьте изображение для справки)

  1. ScrollerView

    a. StackViewA (изображение: зеленый)

    i. LabelA

    ii. Метка B

    b. StackViewB (изображение: зеленый)

    i. LabelC

    ii. LabelD

Я получаю данные из API и могу показать эти данные в этих метках.

Теперь третий набор данных, который я выбираю, является динамическимЭто означает, что может быть еще 2 StackView (изображение: красный) под вторым StackView или еще 3 и т. д. Я предполагаю, что у меня есть дополнение, которое StackView программно в контроллере внутри цикла, так что создается в соответствии с циклом.

В настоящее время мой 3-й StackView также создается в раскадровке, и поэтому он показывает только последние данные из 3-го набора после их циклического просмотра.

Как мне решить эту проблему?

Подробнеев частности:

  1. Как добавить StackView внутри ScrollerView, созданного в раскадровке.

  2. Как мне его разместить, чтобы расположить под2nd StackView также создан в раскадровке.

Check image for reference

Обновление

class InfoDetailsViewController: UIViewController {

// MARK: - Outlets

@IBOutlet weak var infoStack: UIStackView!
@IBOutlet weak var mainScroll: UIScrollView!

static var apiResp: APIDetailsResponse.APIReturn?
let infos: [APIDetailsResponse.Info] = (APIDetailsViewController.apiResp?.content?.infos)!

override func viewDidLoad() {
    super.viewDidLoad()

    infoStack.spacing = 25.0

    for info in infos {

        let addInfoTitle = UILabel()
        addInfoTitle.font = .preferredFont(forTextStyle: .body)
        addInfoTitle.backgroundColor = .orange
        addInfoTitle.translatesAutoresizingMaskIntoConstraints = false

        let addInfoContent = UITextView()
        addInfoContent.font = .preferredFont(forTextStyle: .body)
        addInfoContent.backgroundColor = .green
        addInfoContent.translatesAutoresizingMaskIntoConstraints = false

        addInfoTitle.text = "\(String(describing: (info.info_title)!))"

        let htmlString = "\(String(describing: (info.information)!))"
        // works even without <html><body> </body></html> tags, BTW
        let data = htmlString.data(using: String.Encoding.unicode)!
        let attrStr = try? NSAttributedString(
            data: data,
            options: [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html],
            documentAttributes: nil)
        addInfoContent.attributedText = attrStr


        let childStackView = UIStackView(arrangedSubviews: [addInfoTitle, addInfoContent])
        childStackView.alignment = .fill
        childStackView.axis = .vertical
        childStackView.distribution = .fill
        childStackView.spacing = 5.0

        childStackView.translatesAutoresizingMaskIntoConstraints = false
        infoStack.addArrangedSubview(childStackView)

}
}

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

1 Ответ

1 голос
/ 24 октября 2019

Таким образом, лучшее решение - при создании прокрутки добавить в него представление стека . И всякий раз, когда вы создаете представление стека, динамически добавляйте в это представление стека, которое находится внутри scrollview. Таким образом, в этом случае ваше новое представление стека будет правильно размещено под вашим внешним видом стека.

ScrollView -> 1 Stackview -> несколько представлений динамического стека в цикле

допустим, у вас уже есть стековое представление ParentStackview из вашей раскадровки. Затем выполните следующие действия

lazy var childStackView: UIStackView = {
    let stackView = UIStackView()
    stackView.alignment = .center
    stackView.axis = .vertical
    stackView.distribution = .equalCentering
    stackView.spacing = 30.0
    return stackView
}()

  public func viewDidLoad() {

   ParentStackview.alignment = .center
    ParentStackview.axis = .vertical
    ParentStackview.distribution = .equalCentering
    ParentStackview.spacing = 10.0


  for eachChild in data {
     ParentStackView.addArrangedSubview(childStackView)
      childStackView.translatesAutoresizingMaskIntoConstraints = false
    childStackView.widthAnchor.constraint(equalTo: securityScrollView.widthAnchor)
    //set height too

     // this below function you can use to add eachChild data to you child stackview
     configureStackview(childstackView, eachChild)
   }
 }

Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...