0

我無法正確交換存儲在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的位置,就好像它沒有移動)。

我該如何解決這個問題?

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