0

У меня возникли проблемы с правильной заменой двух 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, как будто оно не перемещается).

Как исправить это?

+0

Вы обновляете вид? [self.view setNeedsDisplay] и/или [self.view layoutIfNeeded] – YoCoh

+0

, который происходит внутри animateInWayX, поэтому он не имеет ничего общего с дисплеем, как при анимации, он должен использовать самые свежие данные – Cindeselia

+0

Я чувствую себя как корень проблема заключается в том, что координаты X и Y отдельных объектов MyImageViews задаются в камне с момента их объявления, поэтому, даже если я изменил их слот в IBOutletArray, сами изображения не будут перемещаться. Мне нужно найти способ обновить данные внутри imageView вместо простого перенаправления указателей ...? – Cindeselia

ответ

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]]; 
Смежные вопросы