Гарантирует ли 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.