Как отобразить пользовательский 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;
}
2 ответа
Гораздо чище и круче было бы переписать 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;
}
А потом, вам просто нужно обновить rowNO
в didSelectRowAtIndexPath
обновить ваши данные и перерисовать ячейку, например так:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (rowNO != indexPath.row)
{
rowNO = indexPath.row;
}
[self.tableView reloadData];
}
Кроме того, вместо перезагрузки всей таблицы [self.tableView reloadData]
Вы можете перезагрузить только две ячейки, которые меняют свой стиль (например, галочку), используя reloadRowsAtIndexPaths
,
Хм, не знаю почему, но я не могу добавлять комментарии, поэтому я пишу это как ответ. Проблема с ответом Thomas Kekeisen состоит в том, что 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;
}
}