2011-03-21 43 views
4

多個項目,我有在我試圖放置一個按鈕,圖像和標籤的實現代碼如下。我想要更改按鈕的圖像,一旦點擊。的UITableView在每個單元

下面的代碼:

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

static NSString *CellIdentifier = @"Cell"; 
checkedImg = [UIImage imageNamed:@"buttonUnChecked1.png"]; 

UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
} 


//Set up the cell... 
NSString *cellValue = [suggestions objectAtIndex:indexPath.row]; 

cell.selectionStyle = UITableViewCellSelectionStyleNone; 

check = [UIButton buttonWithType:UIButtonTypeCustom]; 
check.frame=CGRectMake(0,35,20,20); 
[check setImage:checkedImg forState:UIControlStateNormal]; 
[check addTarget:self action:@selector(checkClicked:) forControlEvents: UIControlEventTouchUpInside]; 
[cell.contentView addSubview:check]; 

cellContent = [[UILabel alloc]initWithFrame:CGRectMake(40,32,500,25)]; 
cellContent.text = cellValue; 
[cell.contentView addSubview:cellContent]; 
return cell; 
} 


-(void)checkClicked:(UIButton *)b 
{ 
checkedImg = [UIImage imageNamed:@"buttonChecked1.png"]; 
[check setImage:checkedImg forState:UIControlStateNormal]; 

} 

通過這樣做,按鈕的圖像都得到改變,但只有最後一個,而不是一個點擊。我知道背後的原因,但我不知道如何實現我想要的。

回答

2

簡單的回答你的問題是要改變你的checkClicked:方法是:

-(void)checkClicked:(UIButton *)b 
{ 
    [b setImage:[UIImage imageNamed:@"buttonChecked1.png"] forState:UIControlStateNormal]; 
} 

但你也應該調整自己的tableView:cellForRowAtIndexPath:方法,以避免重複創建按鈕,並清理一些像這樣的內存問題:

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

static NSString *CellIdentifier = @"Cell";  

UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    UIButton *checkBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
    checkBtn.frame = CGRectMake(0,35,20,20); 
    [checkBtn setImage:[UIImage imageNamed:@"buttonUnChecked1.png"]; forState:UIControlStateNormal]; 
    [checkBtn addTarget:self action:@selector(checkClicked:) forControlEvents: UIControlEventTouchUpInside]; 
    [cell.contentView addSubview:checkBtn]; 

    UILabel *cellContentLbl = [[UILabel alloc]initWithFrame:CGRectMake(40,32,500,25)]; 
    cellContentLbl.tag = 1; 
    [cell.contentView addSubview:cellContentLbl]; 
    [cellContentLbl release]; 
} 


//Set up the cell... 
NSString *cellValue = [suggestions objectAtIndex:indexPath.row]; 
cellContent = (UILabel *)[cell viewWithTag:1]; 
cellContent.text = cellValue; 
return cell; 
} 
+0

不這段代碼無法復位重新使用的電池的狀態?如果你點擊一個單元格的按鈕,然後滾動,點擊按鈕將出現在他們不應該的地方。 – occulus 2011-03-21 16:26:26

+0

非常感謝@theChrisKent – Ashutosh 2011-03-21 16:29:27

+0

但還有一個問題,如果用戶再次點擊,它應該再次取消選中。爲此,我將checkClicked方法更改爲: - (void)checkClicked:(UIButton *)b { \t如果(選中!){ \t \t並[b setImage:checkedImg forState:UIControlStateNormal]; \t \t檢查= YES; \t} \t else { \t \t [b setImage:unCheckedImg forState:UIControlStateNormal]; \t} \t } 但現在,如果用戶取消選中一個按鈕,然後點擊另一個按鈕它不工作,因爲布爾值更改爲YES之後。 – Ashutosh 2011-03-21 16:56:06

3

一個結構化的方式來獲得你正在尋找的結果:

做一個UIView子類,對你的TA可調電池(包含按鈕和標籤)。您實例化這些自定義視圖並將其設置爲您contentViewcellForRowAtIndexPath每個表格單元格。

您的每個自定義視圖偵聽被按下了自己的按鈕。當它被按下時,它切換它的狀態並告訴主視圖控制器(通過委託方法)它已被切換。主視圖控制器在有問題的單元上調用reloadData,使其重新載入正確的外觀。

請注意,這種方法要求您告訴每個自定義視圖,它在表中呈現哪個索引路徑 - 這樣它可以通知主視圖控制器的委託方法 - 觸發重載需要此信息適當的細胞。

順便說一句,我猜你想在用戶完成編輯時查看錶格中按鈕的狀態,而且你當前的方法不能非常明確地捕獲狀態 - 你必須迭代在你的按鈕上,或者將選定的項目添加到可變數組中,或者其他東西。

+0

+1,因爲這解決了真正的問題 - 設計。 – theChrisKent 2011-03-21 17:27:53

相關問題