2013-01-17 84 views
2

我有一個需要自定義的UITableViewCellAccessoryCheckmark的表視圖。當選中一行時,將顯示覆選標記,並在選擇另一行時消失,然後出現在最後選定的最後一個視圖上。這工作正常。如何顯示自定義的UITableViewCellAccessoryCheckmark

問題就出現了,當我使用這行:

cell.accessoryView = [[ UIImageView alloc ] 
          initWithImage:[UIImage imageNamed:@"icon-tick.png" ]]; 

添加自定義UITableViewCellAccessoryCheckmark。在該代碼之後,UITableViewCellAccessoryCheckmark保留在所有行上,並且在觸摸另一行時不會消失。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

int index = indexPath.row; id obj = [listOfItems objectAtIndex:index]; 

    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 

NSLog(@"%d",indexPath.row); 
if (rowNO!=indexPath.row) { 
    rowNO=indexPath.row; 
    [self.tableView cellForRowAtIndexPath:indexPath].accessoryType=UITableViewCellAccessoryCheckmark; 

    cell.accessoryView = [[ UIImageView alloc ] 
          initWithImage:[UIImage imageNamed:@"icon-tick.png" ]]; 

    [self.tableView cellForRowAtIndexPath:lastIndexPth].accessoryType=UITableViewCellAccessoryNone; 
    lastIndexPth=indexPath; 
} 
+0

必須創建一個用於cicle爲消失的所有其他細胞 –

+0

這個環節也是對您有用 http://stackoverflow.com/questions/6359043/is-uitableviewcellaccessorycheckmark-an-image –

+0

此鏈接對您也有用 http://stackoverflow.com/questions/6359043/is-uitableviewcellaccessorycheckmark-an-image –

回答

8

一個更清潔,更酷的方式將覆蓋的UITableViewCell這樣的:

- (void)setAccessoryType:(UITableViewCellAccessoryType)accessoryType 
{ 
    // Check for the checkmark 
    if (accessoryType == UITableViewCellAccessoryCheckmark) 
    { 
     // Add the image 
     self.accessoryView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"YourImage.png"]] autorelease]; 
    } 
    // We don't have to modify the accessory 
    else 
    { 
     [super setAccessoryType:accessoryType]; 
    } 
} 

如果你這樣做,你可以繼續使用UITableViewCellAccessoryCheckmark,因爲你的類會自動用圖像替換它。

您應該只在cellForRowAtIndexPath方法中設置樣式。就像這樣:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // [init subclassed cell here, dont forget to use the table view cache...] 

    cell.accessoryType = (rowNO != indexPath.row ? nil : UITableViewCellAccessoryCheckmark); 

    return cell; 
} 

然後,你就必須在didSelectRowAtIndexPath更新rowNO更新您的數據和重繪細胞,就像這樣:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if (rowNO != indexPath.row) 
    { 
     rowNO = indexPath.row; 
    } 

    [self.tableView reloadData]; 

} 

此外,而不是與[self.tableView reloadData]重新加載整個表,您只能使用reloadRowsAtIndexPaths重新加載更改其樣式的兩個單元格(例如對號)。

3

嗯不知道爲什麼,但我不能添加評論,所以即時通訊寫這個答案。 Blauesocke答案的問題是AccessoryType將不會設置爲UITableViewCellAccessoryCheckmark,因此您無法檢查單元格AccessoryType。有沒有辦法做到這一點,所以細胞AccessoryType將corect類型只是另一個圖像。

我使用的方法是這樣的:

- (void)setAccessoryType:(UITableViewCellAccessoryType)newAccessoryType 
{ 
    [super setAccessoryType:newAccessoryType]; 
    // Check for the checkmark 
    switch(newAccessoryType) 
    { 
     case UITableViewCellAccessoryCheckmark: 
      self.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yorCheckmark.png"]]; 
      break; 
     case UITableViewCellAccessoryNone: 
      self.accessoryView = nil; 
      break; 
     default: 
      break; 
    } 

} 
+0

爲什麼要檢查附件類型? –

+0

因爲我正在使用它來取消選中或檢查單元格。是的,我知道還有其他的可能性,但我在舊的代碼中使用了它,並請求更改圖標。所以答案是我不想改變舊的代碼:)。 – kubo

+0

很棒!謝謝 – tesmojones