Обмен изображениями в коллекции IBOutletCollection
У меня возникли проблемы с правильной заменой двух UIImageViews, хранящихся в IBOutletCollection. Концептуально я должен делать что-то не так.
Допустим, у меня есть NSMutableArray индексированных данных и NSMutableArray индексированных UIImageViews, где я хотел бы, чтобы два индексированных массива соответствовали друг другу, то есть n-индексированный элемент массива UIImageView должен отражать n-й элемент данных в массиве изображений.
@property (nonatomic, strong) IBOutletCollection(MyImageView) NSMutableArray* myImages;
@property (nonatomic, strong) NSMutableArray* myData;
Вначале я сортирую IBOutletCollection по x-координате так, чтобы изображение на экране было слева направо, то есть элемент индекса 0 должен отображаться полностью слева,..., вплоть до справа от экрана.
NSComparisonResult imageSort(id label1, id label2, void* context)
{
if ([label1 frame].origin.x < [label2 frame].origin.x)
return NSOrderedAscending;
else if ([label1 frame].origin.x > [label2 frame].origin.x)
return NSOrderedDescending;
else { // Determine using y-coordinate
if ([label1 frame].origin.y < [label2 frame].origin.y)
return NSOrderedAscending;
else if ([label1 frame].origin.y > [label2 frame].origin.y)
return NSOrderedDescending;
else
return NSOrderedSame;
}
}
Теперь, когда я хочу поменять местами два элемента массива данных, я также обязательно поменяю местами их изображения, чтобы каждый UIImageView всегда отражал данные в этом слоте. Скажем, два элемента, которые я хочу поменять, имеют индексы frontIndex и backIndex:
// Switch state data in arrays
Data* sendToBack = myData[frontIndex];
Data* bringToFront = myData[backIndex];
myData[frontIndex] = bringToFront;
myData[backIndex] = sendToBack;
MyImageView* sendToBackImg = myImages[frontIndex];
MyImageView* bringToFrontImg = myImages[backIndex];
myImages[frontIndex] = bringToFrontImg;
myImages[backIndex] = sendToBackImg;
Проблема возникает, когда я пытаюсь оживить или обновить массив изображений. Похоже, что когда я вызываю animate или update для обновленного элемента массива с индексами 0 и 9, фактически обновляемые представления не являются расположенными слева и девятым слева: они обновляются в своих новых местоположениях:
[myImages[frontIndex] animateInWayX]; --> this updates the on-screen view at backIndex
[myImages[backIndex] animateInWayY]; --> this updates the on-screen view at frontIndex
Я проверил массивы в отладчике, и перестановка произошла - другими словами, элемент frontIndex в массиве myImages действительно показывает правильные данные, отражающие модель в myData[frontIndex], поэтому массив представлений правильно переставлен, это просто отображение в новом месте на экране (местоположение backIndex, как если бы оно не двигалось).
Как это исправить?
1 ответ
Да, как указывал комментатор выше, вы меняете только указатели. Лучшее решение - скопировать содержимое, на которое указывают.
// Switch state data in arrays
Data* temp = [[DataObject alloc] init];
[self copyDataFrom:bringToFront into:temp];
[self copyDataFrom:sendToBack into:myData[frontIndex]];
[self copyDataFrom:temp into:myData[backIndex]];
MyImageView* frontImg = myImages[frontIndex];
MyImageView* backImg = myImages[backIndex];
[frontImg updateUsingData:myData[frontIndex]];
[backImg updateUsingData:myData[backIndex]];