Имеет ли массив childViewControllers определенный порядок в контроллере представления с различными контейнерами?

У меня есть базовый контроллер представления с различными контейнерами внутри. Я использую их для управления текущим шагом процесса, и одновременно виден только один из них. Я создал перечисление для шагов и использую его Int rawValue для доступа к контейнерам, соответствующим каждому шагу, по тегу, изменяя его видимость.

Но в некоторые моменты мне приходится передавать некоторую информацию одному или нескольким пошаговым контроллерам. Я думал использовать тот же подход enum для доступа к положению соответствующего контроллера представления в массиве childViewControllers, чтобы сделать это.

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

Кто-нибудь знает это или есть лучший способ добиться чего-то подобного?


person GustavoAzOl    schedule 22.03.2019    source источник
comment
Я использую isHidden для управления переходами... вы имеете в виду, что устанавливаете свойство .isHidden контейнерных представлений, которые вы добавили в раскадровку?   -  person DonMag    schedule 22.03.2019
comment
Я отредактирую вопрос.   -  person GustavoAzOl    schedule 22.03.2019


Ответы (3)


Возможно, было бы лучше поддерживать порядок вручную, например, создав переменную Array, которая будет заполнена ссылками на ваши контейнеры/контроллеры в том порядке, в котором вам нужно.

Просто подключите все представления контейнеров к коллекции розеток и скройте или отобразите определенные ее элементы.

@IBOutlet var containers: [UIView]!

containers[0].isHidden = true
containers[1].isHidden = false

For keeping order of controllers just create array variable and fill it with controllers' references. If you're using segues, append destinations of embed segues. If you're adding child controllers by addChild(_:), simply append controllers which you're adding

var controllers: [UIViewController]
person Robert Dresler    schedule 22.03.2019
comment
Я отредактировал вопрос, чтобы уточнить проблему. Но если подумать о видимости представлений, ваше решение кажется намного лучше, чем подход с тегами. - person GustavoAzOl; 22.03.2019

Если у вас есть представления контейнеров, подключенные через IBOutlets, и вы хотите отслеживать их с помощью «упорядоченного» массива, вы можете сделать это:

class ContainersViewController: UIViewController {

    @IBOutlet var containerA: UIView!
    @IBOutlet var containerB: UIView!
    @IBOutlet var containerC: UIView!

    var orderedContainers = [UIView]()

    override func viewDidLoad() {
        super.viewDidLoad()

        orderedContainers = [containerA, containerB, containerC]

    }

}

С этого момента вы можете использовать индексацию, например:

orderdContainers[1].isHidden = true
person DonMag    schedule 22.03.2019
comment
Я редактирую вопрос, чтобы уточнить. Старая немного вводила в заблуждение. - person GustavoAzOl; 22.03.2019
comment
@GustavoAzOl - см. этот ответ stackoverflow.com/a/48892520/6257435 - person DonMag; 22.03.2019
comment
Увидев ответ, да, я мог бы использовать подготовку к переходу для хранения ссылок... Но я подумал, что если бы можно было использовать уже существующие childViewControllers, не было бы необходимости хранить больше ссылок на контроллеры, и я мог бы попробовать что-то например, объединение последовательностей раскадровки/дочернего порядка и массива ответов контейнера, размещенных здесь. - person GustavoAzOl; 22.03.2019
comment
Опираться на порядок, в котором они были добавлены в раскадровку, может быть проблематично. Предположим, вы начинаете с 4 шагов, а затем решаете, что вам нужен новый шаг между 2 и 3? Вы можете удалить/повторно добавить свои контейнерные представления или переназначить переходы... Но также возможно, что будущие версии Xcode/iB могут изменить это. Может быть, лучше явно отслеживать, что у вас происходит. - person DonMag; 22.03.2019

Да, это заказано

let v = Vvv()

self.addChild(v)

let d = Ddd() 

self.addChild(d)

print(self.children)

[dfjkfjdjdjdfjfdkas.Vvv: 0x1041086e0,dfjkfjdjdjdfjfdkas.Ddd: 0x104012060]


class Vvv:UIViewController {

} 
class Ddd:UIViewController {

}

введите здесь описание изображения

person Sh_Khan    schedule 22.03.2019
comment
Но я добавил все дочерние контроллеры в раскадровку путем встраивания. Даже в этом случае я могу гарантировать всегда один и тот же порядок? - person GustavoAzOl; 22.03.2019
comment
Я тоже попробовал этот тест, и мне показалось, что они появляются в том же порядке. Просто хотел получить подтверждение того, что это будет работать одинаково во всех версиях iOS. - person GustavoAzOl; 22.03.2019