我无法正确交换存储在IBOutletCollection中的两个UIImageView。从概念上讲,我一定是做错了。
假设我有索引数据的NSMutableArray和索引UIImageViews的NSMutableArray,我希望两个索引数组对应,即UIImageView数组的第n个索引元素应该反映图像中的第n个数据元素阵列。
@property (nonatomic, strong) IBOutletCollection(MyImageView) NSMutableArray* myImages;
@property (nonatomic, strong) NSMutableArray* myData;
首先,我按x坐标对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;
当我尝试动画或更新图像阵列时,会出现问题。看来,当我在索引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 :(得分: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]];