gpt4 book ai didi

ios - 在 IBOutletCollection 中交换图像

转载 作者:行者123 更新时间:2023-11-29 03:16:49 28 4
gpt4 key购买 nike

我无法正确交换存储在 IBOutletCollection 中的两个 UIImageView。从概念上讲,我一定做错了什么。

假设我有一个索引数据的 NSMutableArray 和一个索引 UIImageViews 的 NSMutableArray,我希望这两个索引数组对应,即 UIImageView 数组的第 n 个索引元素应该反射(reflect)图像中的第 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 始终反射(reflect)该槽中的数据。假设我要交换的两个元素具有索引 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 处对更新后的数组元素调用 animate 或 update 时,实际更新的 View 不是位于最左侧和左侧第 9 个的 View :它们正在新位置更新:

[myImages[frontIndex] animateInWayX]; --> this updates the on-screen view at backIndex
[myImages[backIndex] animateInWayY]; --> this updates the on-screen view at frontIndex

我检查了调试器中的数组,交换确实发生了——换句话说,myImages 数组内的 frontIndex 元素确实显示了反射(reflect) myData[frontIndex] 处模型的正确数据,因此 View 数组已正确交换,它只是显示在屏幕上的一个新位置(backIndex 的位置,好像它没有移动)。

如何解决这个问题?

最佳答案

是的,正如上面的评论者所指出的,您只是在交换指针。最好的解决方案是复制指向的内容。

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

关于ios - 在 IBOutletCollection 中交换图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21596502/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com