我無法正確交換存儲在IBOutletCollection中的兩個UIImageView。從概念上講,我一定在做錯事。假設我有一個索引數據的NSMutableArray和一個索引UIImageViews的NSMutableArray,我希望這兩個索引數組對應,也就是說UIImageView數組的第n個索引元素應該反映在這個數組中的第n個數據元素圖像陣列。在IBOutletCollection中交換圖像
@property (nonatomic, strong) IBOutletCollection(MyImageView) NSMutableArray* myImages;
@property (nonatomic, strong) NSMutableArray* myData;
首先,我通過我的IBOutletCollection排序x座標,以使屏幕上的顯示是左到右,即索引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的位置,就好像它沒有移動)。
我該如何解決這個問題?
您是否正在更新視圖? [self.view setNeedsDisplay]和/或[self.view layoutIfNeeded] – YoCoh
發生在animateInWayX中,所以它與顯示無關,因爲當動畫發生時,它必須使用最新的數據 – Cindeselia
我覺得像根問題在於,從聲明它們的那一刻起,單個MyImageViews的X和Y座標就設置成了石頭,因此即使我更改了它們在IBOutletArray中的插槽,imageViews本身也不會移動。我需要找到一種方法來刷新imageView中的數據,而不是重定向指針......? – Cindeselia