2011-04-13 47 views
1

我在編碼時遇到了一個問題,也就是說,我使用帶自定義按鈕的循環在視圖中顯示了20幅圖像。一段時間後,我正在用新圖像更改按鈕圖像。但是在這裏發生的舊圖像顯示在當前圖像的背面。如何刪除舊圖像的新圖像在objective-c

for(currentRow = 0; currentRow < 5; currentRow++) 
    { 
     for (currentColumn = 0 ; currentColumn < 4; currentColumn++) 
     { 
      if(indexValue<20) 
      { 
       printf("\n index value %d",indexValue); 
       A *aObject = [aList objectAtIndex:indexValue]; 

       MyCustomButton *myButton = [[MyCustomButton alloc] initWithIdValue:aObject.aName]; 
       CGRect imageFrame = CGRectMake(currentColumn * 80+5, currentRow * 80+5, 67, 67); 
       [myButton setImage:[UIImage imageNamed:aObject.aName] forState:UIControlStateNormal]; 
       [myButton setFrame:imageFrame]; 
       myButton.backgroundColor=[UIColor clearColor]; 
       [myButton addTarget:self action:@selector(aAction:) forControlEvents:UIControlEventTouchUpInside]; 
       [myView addSubview:myButton]; 
       [myButton release]; 
       myButton = nil; 
} 
} 
} 

幫我出這一點,

謝謝 馬丹·莫漢。

+1

如果你粘貼你的代碼,我相信我們會在沒有時間修復 – 2011-04-13 13:31:09

+0

請發佈一些代碼,它很難分辨沒有它的情況。話雖如此,這聽起來像你正在分配新的UIImageViews,而不是改變舊的圖像。 – MCannon 2011-04-13 13:31:27

+0

編輯該問題並添加循環,在其中最初更新UIButton圖像。 – 2011-04-13 13:31:36

回答

1

正如onnoweb已經提到: 你不應該在每次你想改變圖像時添加一個新的按鈕。 我會選擇的方法是,在視圖的viewDidLoad中創建所需的所有按鈕並將它們添加到那裏。 例如像這樣:(僞代碼)

- (void)viewDidLoad 
{ 
    for(int i = 0; i < columnCount; i++) 
    { 
     for(int j = 0; j < rowCount; j++) 
     { 

      MyCustomButton *myButton = [[MyCustomButton alloc] initWithIdValue:aObject.aName]; 
      CGRect imageFrame = CGRectMake(currentColumn * 80+5, currentRow * 80+5, 67, 67); 
      forState:UIControlStateNormal]; 
      [myButton setFrame:imageFrame]; 
      myButton.backgroundColor=[UIColor clearColor]; 
      [myButton addTarget:self action:@selector(aAction:) forControlEvents:UIControlEventTouchUpInside]; 
      [myView addSubview:myButton]; 
      [myButton release]; 
      myButton = nil; 
     } 
    } 
} 

然後,你可以更改與以下行循環的圖像:(僞代碼)

  myButton = buttonMatrix[row][column]; 
      [myButton setImage:[UIImage imageNamed:aObject.aName] forState:UIControlStateNormal]; 

這也是要少得多內存佔用比始終創建新按鈕而不釋放舊的按鈕。

+0

@Madan Mohan 我在這裏寫的代碼不適合您複製並粘貼到您的項目中。那麼它不會工作。我只是使用您發佈的代碼以僞代碼的形式編寫此代碼,以便您考慮自己編寫的代碼。這樣你就不會再犯這個錯誤了。 :) – Maverick1st 2011-04-13 16:27:15

0

有兩個選項來解決此問題:

1)保存您的循環創建的按鈕指針,更新圖像時,使用該按鈕指針調用setImage:forState:再次,這將取代在新圖像的按鈕中的舊圖像。並保存按鈕的init/destroy時間。

2)將按鈕指針保存爲步驟1),調用[button removeFromSuperView]從超級視圖中刪除按鈕,然後重新創建一個新按鈕並再次插入超級視圖。這是不推薦的方法,因爲舊按鈕將被銷燬,並且新按鈕將被初始化,這兩個操作都會降低性能(時間),並且如果在按鈕頂部添加了其他子視圖,則在創建新按鈕後,您需要將按鈕頂部的所有視圖重新放在頂部。所以如果您沒有任何特定的原因需要重新創建一個新按鈕,請按照步驟1),它非常簡單快捷。