0

IBOutletCollection에 저장된 두 개의 UIImageViews를 바르게 바꾸는 데 문제가 있습니다. 개념적으로, 나는 틀린 일을해야만합니다.IBOutletCollection의 이미지 교환

인덱스 된 데이터의 NSMutableArray와 인덱싱 된 UIImageViews의 NSMutableArray가 있다고 가정 해 봅니다. 두 인덱스 배열이 일치하도록하고 싶습니다. 즉, UIImageView 배열의 n 번째 인덱싱 된 요소에 n 번째 데이터 요소가 반영되어야합니다. 이미지 배열. 처음부터

@property (nonatomic, strong) IBOutletCollection(MyImageView) NSMutableArray* myImages; 
@property (nonatomic, strong) NSMutableArray* myData; 

, 내가하여 내 IBOutletCollection 정렬하려면 화면의 외관이 왼쪽에서 오른쪽으로되어, 인덱스 0의 요소가 왼쪽에있는 모든 방법을 표시해야 즉, 그래서 X를 좌표 .. ., 화면 오른쪽 끝까지. 나는 데이터 배열의 두 멤버를 교체 할 때마다

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 항상 그 슬롯에 데이터를 반영 할 수 있도록,뿐만 아니라 자신의 이미지를 교체해야합니다. 내가 애니메이션이나 이미지의 배열을 업데이트하려고하면

// 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; 

문제가 발생합니다의 내가 교환 할 두 가지 요소는 인덱스 frontIndex 및 backIndex 있다고 가정 해 봅시다. 업데이트 된 배열 요소의 인덱스 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 

디버거에서 배열을 검사했는데 스왑이 발생했습니다. 즉, myImages 배열의 frontIndex 요소는 myData [frontIndex]에서 모델을 반영하는 적절한 데이터를 표시하므로 뷰 배열이 올바르게됩니다. 스왑 된, 그것은 화면의 새로운 위치 (backIndex의 위치, 마치 움직이지 않는 것처럼)에 표시됩니다.

어떻게 수정합니까?

+0

보기를 업데이트하고 있습니까? [self.view setNeedsDisplay] 및/또는 [self.view layoutIfNeeded] – YoCoh

+0

은 animateInWayX 내부에서 발생하므로 애니메이션과 같이 아무런 관련이 없습니다. 가장 신선한 데이터를 사용해야합니다. – Cindeselia

+0

루트처럼 느껴집니다. 문제는 개별 MyImageViews의 X 및 Y 좌표가 선언 한 순간부터 돌변으로 설정되어 있으므로 IBOutletArray에서 슬롯을 변경하더라도 imageViews 자체가 움직이지 않는다는 것입니다. 포인터를 리디렉션하는 대신 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]];