【问题标题】:Swapping images in an IBOutletCollection在 IBOutletCollection 中交换图像
【发布时间】:2014-03-03 00:29:28
【问题描述】:

我无法正确交换存储在 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 处对更新的数组元素调用 animate 或 update 时,实际更新的视图不是位于最左边和左起第 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的位置,就好像它没有移动一样)。

我该如何解决这个问题?

【问题讨论】:

  • 您在更新视图吗? [self.view setNeedsDisplay] 和/或 [self.view layoutIfNeeded]
  • 发生在animateInWayX内部,所以和显示无关,因为动画发生时,必须使用最新鲜的数据
  • 我觉得问题的根源在于,从我声明它们的那一刻起,各个 MyImageViews 的 X 和 Y 坐标就是一成不变的,所以即使我改变了它们在 IBOutletArray 中的位置, imageViews 本身永远不会移动。我需要找到一些方法来刷新 imageView 中的数据,而不仅仅是重定向指针...?
  • 我刚刚想到的另一件事...您是否使用自动布局约束?如果是,则需要更新约束(和 [self.view setNeedsUpdateConstraints])关于 UIImageViews,NSLog UIImage 属性以确保它们的地址实际上也发生了变化。
  • 我认为您是在交换指针而不是交换图像本身。由于交换指针时图像视图的位置不会交换,因此您没有得到所需的结果。 NSLog 图像视图帧的来源以检查这一点。

标签: ios objective-c arrays model-view-controller iboutletcollection


【解决方案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]];

【讨论】:

    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 2014-04-09
    相关资源
    最近更新 更多