Гарантирует ли IBOutletCollection правильный порядок?

У меня есть два противоречащих источника в отношении IBOutletCollection с NSArray. Вначале говорится, что порядок, который вы связываете с интерфейсом с выходом, является значительным, и он всегда будет таким же в сборе в сети. Например. если мы сначала привяжем первое текстовое поле к коллекции, номер элемента 0 будет этим полем и т.д.

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

"Программирование iOS 6 - исследование SDK для iOS" является первым источником, а курс Stanford в iTunes является вторым источником. Кто прав?

Ответы

Ответ 1

Оба источника являются правильными: с одной стороны, из-за деталей реализации Interface Builder порядок поиска элементов в IBOutletCollection будет сохранен при поиске; с другой стороны, вы должны избегать использования этого заказа в своем коде, потому что нет способа проверить этот порядок.

Представьте, что вы занимаетесь чьим-то проектом. Если вы видите цикл над IBOutletCollection, обратите внимание, что порядок итераций имеет значение, и вы решили проверить, что это за заказ, или заставить новый порядок, вам придется удалить и снова добавить элементы управления в свою коллекцию. Вот почему вы должны относиться к своим IBOutletCollection элементам как неупорядоченные. Если необходимо сохранить определенный порядок, скопируйте элементы в NSArray, отсортируйте их по некоторому известному свойству и затем выполните итерацию скопированной коллекции.

Ответ 2

Кажется, что в Xcode 7.x упорядочивается коллекция IBOutlet.

Конечно, вы можете назначить свойство тега каждому элементу коллекции в нужном порядке и сделать что-то вроде

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.outletCollection = [self.outletCollection sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"tag" ascending:YES]]];
}

Ответ 3

btnCollection = btnCollection.sorted(by: { $0.tag < $1.tag})

Просто назначьте порядок элементов управления Tag и загрузите их.

Ответ 4

В Xcode 7.2 Коллекция IBOutlet упорядочивается так, как были сделаны соединения. Я тестировал его с помощью Swift на iOS 8.2 и 9.2.