2011-01-11 91 views
3

我已經創建了三個按鈕,併爲正常狀態和選定狀態設置背景圖像。當我點擊按鈕時,改變了一個圖像作爲選定的狀態。但是,當滾動表格視圖時,所選圖像不會保留(之前選定的單元格),這意味着它用於正常狀態。如何在iPhone中點擊UIButton時保持選定的狀態?

我的代碼,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    likeBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 

    UIImage *likeSelectedImage = [UIImage imageNamed:@"like.png"]; 

    //set image as background for button in the normal state 

    [likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateNormal]; 

    [likeBtn addTarget:self action:@selector(likeAction:) forControlEvents:UIControlEventTouchUpInside]; 

    [cell.contentView addSubview:likeBtn]; 
} 

我的按鈕操作是,

-(void) likeAction : (id) sender 
{ 
    UIImage *likeSelectedImg = [UIImage imageNamed:@"like-selected.png"]; 

    UIImage *likeImg = [UIImage imageNamed:@"like.png"]; 

      if ([sender isSelected]) { 
       [sender setImage:likeImg forState:UIControlStateNormal]; 
       [sender setSelected:NO]; 
       }else { 
       [sender setImage:likeSelectedImg forState:UIControlStateSelected]; 
       [sender setSelected:YES]; 
      } 

} 

SO我的問題是,當我滾動表格視圖電池,圖像的先前選擇的狀態不被保留。因爲cellForRowAtIndex方法已經反覆調用,當我滾動表。所以它會自動設置"[likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateNormal];"。如何避免這個問題? 那麼請幫助我? 謝謝!

+0

pugal您好我有同樣的問題,你我嘗試代碼也作爲par在你的答案,但它不能正常工作你可以告訴我如何存儲按鈕保持所有錶行的所有按鈕狀態。我不知道如何保持按鈕狀態數組請說如何做到這一點在代碼這是鏈接,我保持代碼http://stackoverflow.com/questions/8294981/how-to-toggle-image-on-button-for -every-row-tableviewcell-in-iphone – Rocky 2011-12-01 05:03:39

+0

請幫我,我嘗試從最後3天它不工作我我昨晚得到你的鏈接,我嘗試,但我沒有得到任何解決方案,我希望你會幫我出 – Rocky 2011-12-01 05:04:15

回答

5

您看見這是由於設計模式的UITableView的使用用於顯示數據。爲了最大限度地減少資源使用量,只保證當前屏幕上的表格單元格保存在內存中。當單元格在屏幕外滾動時,單元對象將被循環使用,以用於新單元出現在列表的另一端,從而失去它們的狀態。

我假設你在tableView: cellForRowAtIndexPath:中返回了一個單元格的時候有點修剪了你的代碼,但是你發佈的代碼段中的任何地方都沒有引用該變量。這使得在添加按鈕之前無法看到你如何獲得單元格。

在黑暗中暗示您的代碼是如何工作的,但這裏有關於您需要做什麼以保留狀態的高級概述。

  1. 創建一些控制器級存儲(如NSArray)以保存所有錶行的所有按鈕狀態。
  2. likeAction確定按鈕是從(創建時,它的行號可能分配給該按鈕的標籤屬性)哪一行,並在您的NSArray
  3. 更新相應的行狀態。在tableView: cellForRowAtIndexPath:設置你的按鈕,用通過使用從NSArray獲取給定indexPath的狀態來更正圖像。
0

您可以爲每個帶有標識符的單元格使用'reuseIdentifier'。

cell = [[[ToDoSummaryTableViewCell alloc] 
        initWithStyle:UITableViewCellStyleDefault reuseIdentifier:.<identifier>] autorelease]; 
1

上面一個是不正確的語法:

cell = [[[ToDoSummaryTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease]; 

給每個小區的唯一標識符,它應該工作。

查看在XCode IOS api中使用'reuseidentifier'的示例代碼。

感謝, 巴拉斯

0

我重新編輯上面的代碼。我希望,我會幫助你。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

     likeBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 

     UIImage *likeSelectedImage = [UIImage imageNamed:@"like.png"]; 

     //set image as background for button in the normal state 

     [likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateNormal]; 
     [likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateHighlighted]; 

     [likeBtn addTarget:self action:@selector(likeAction:) forControlEvents:UIControlEventTouchUpInside]; 

     [cell.contentView addSubview:likeBtn]; 
} 
相關問題