Программно получить пользовательские UIViews, встроенные в UIStackView - PullRequest
1 голос
/ 03 мая 2019

В моем ViewController у меня есть 12 пользовательских UIViews (с именем CardView).

enter image description here

Я пытаюсь перебрать подпредставления ViewController программно, чтобы найти пользовательское представление (CardView) и выполнить некоторую настройку. Ниже приведен мой код для подсчета количества CardViews.

    private func cardCount()->Int{
            var count = 0
            for subview in self.view.subviews{
                if subview is CardView{
                    count = count + 1
                }
            }
            return count
    }

Однако он возвращает мне «0», и причина в том, что мои взгляды встроены в UIStackViews. У меня есть 3 горизонтально выровненных вида стека внутри вертикально выровненных, как -

enter image description here

Как я могу получить мои CardViews программно. Любая помощь будет оценена.

Ответы [ 5 ]

2 голосов
/ 03 мая 2019

Вы можете сделать несколько плоских карт, чтобы сначала сплющить структуру вашего вида, а затем сосчитать их:

private func cardCount()->Int{

    var count = 0
    for subview in self.view.subviews.flatMap { $0.subviews }.flatMap { $0.subviews }{
        if subview is CardView{
            count = count + 1
        }
    }
    return count

}

Но я чувствую, что вы делаете вещи неправильно.Количество карт звучит как что-то в вашей модели.У вас должна быть переменная cardCount, и карты на экране должны меняться в соответствии с этой переменной, а не наоборот.

0 голосов
/ 03 мая 2019

Создайте метод расширения, подобный этому.Он будет считать все экземпляры CardView в контроллере представления.

extension UIView {
    func cardCount() -> Int {
        switch self {
        case let self as CardView:
            return 1
        case let self as UIStackView:
            return self.arrangedSubviews.reduce(0, { $0 + $1.cardCount() })
        default:
            return self.subviews.reduce(0, { $0 + $1.cardCount() })
        }
    }
}

и вызовет этот метод в viewDidLoad

class ViewControllerd: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        print(self.view.cardCount())
    }
}
0 голосов
/ 03 мая 2019

Попробуйте это

private func cardCount() -> Int
{
    var count = 0
    for subview in self.view.subviews
    {
        if let stackView: UIStackView = subview as? UIStackView
        {
            let arrangedViews = stackView.arrangedSubviews
            for cardView in arrangedViews
            {
                if cardView is CardView
                {
                    count = count + 1
                }
            }

        }
    }
    return count
}
0 голосов
/ 03 мая 2019

Из представленной вами графической диаграммы кажется, что StackView - первый дочерний элемент.Всякий раз, когда вы получаете подпредставления, возвращаются только первые дочерние представления.Таким образом, self.view.subviews приведет только к одному UIStackView.Присвойте тег каждому виду стека.Затем в коде:

private func cardCount()->Int{
        var count = 0
        for subview in self.view.subviews{
            if subview.tag == 10 {  // parent stack view
                 for subviewStack in subview {  // Get subviews of parent stackview
                      if subviewStack.tag == 11 {  // First stack view child
                          for subViewSubStack in subviewStack.subviews { // Get card views in this stack view
                              // Apply your count logic 
                          }
                      }
                 }

            }
        }
        return count
}  

я написал только первое условие.Вы можете добавить других.
Сказав это, я не скажу, что это самое оптимальное решение.Это может и должно быть реорганизовано.

0 голосов
/ 03 мая 2019

Вы создаете IBOutlets для каждого из горизонтальных стековых представлений. Затем переберите подпредставления в виде стека.

@IBOutlet weak var StackView1: UIStackView!
@IBOutlet weak var StackView2: UIStackView!
@IBOutlet weak var StackView3: UIStackView!



  for customView in StackView1.arrangedSubviews
  {
     // Do task
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...