У меня возникли проблемы с правильной заменой двух UIImageView, сохраненных в IBOutletCollection. Понятно, что я должен делать что-то неправильно.Обмен изображениями в IBOutletCollection
Предположим, что у меня есть индексированные данные NSMutableArray и NSMutableArray индексированных UIImageViews, где мне бы хотелось, чтобы два проиндексированных массива соответствовали, то есть элемент nth-indexed массива UIImageView должен отражать n-й элемент данных в массив изображений.
@property (nonatomic, strong) IBOutletCollection(MyImageView) NSMutableArray* myImages;
@property (nonatomic, strong) NSMutableArray* myData;
В самом начале, я отсортировать мой IBOutletCollection по х-координату, так что появление на экране слева направо, т.е. элемент индекса 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 или обновляю обновленный элемент массива в индексах 0 и 9, просмотры, которые фактически обновляются, не те, что расположены слева и 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], поэтому массив представления правильно swapped, он просто отображается в новом месте на экране (местоположение backIndex, как будто оно не перемещается).
Как исправить это?
Вы обновляете вид? [self.view setNeedsDisplay] и/или [self.view layoutIfNeeded] – YoCoh
, который происходит внутри animateInWayX, поэтому он не имеет ничего общего с дисплеем, как при анимации, он должен использовать самые свежие данные – Cindeselia
Я чувствую себя как корень проблема заключается в том, что координаты X и Y отдельных объектов MyImageViews задаются в камне с момента их объявления, поэтому, даже если я изменил их слот в IBOutletArray, сами изображения не будут перемещаться. Мне нужно найти способ обновить данные внутри imageView вместо простого перенаправления указателей ...? – Cindeselia