2014-01-31 2 views
4

Я хотел бы изменить UIImage, который находится внутри UITableViewCell, когда пользователь выбирает строку. То теперь слишком много. Я могу сделать это в didSelectRowAtIndex просто отлично. Однако, и проблема заключается в том, что я хочу, чтобы другие ячейки (каждый cell имел стандартное изображение), чтобы снова иметь стандартное изображение. (Если ячейки снова имеют стандартное изображение, выбранное изображение должно быть «отмечено» (это означает, что немаркированное изображение будет заменено отмеченным изображением, для которого у меня уже есть код)UITableView изменить изображение на ячейку выбрать и сбросить другие

См. Его как Checkbox что вы знаете из HTML

Вот моя попытка:.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [tableView cellForRowAtIndexPath:indexPath]; 
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:YES]; 

    //Little flashing animation 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    [UIView animateWithDuration:2.0f animations:^{ 

    } completion:^(BOOL finished) { 
     ; 
    }]; 

    //Mark the selected cell 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    ALog(@"%i", cell.imageView.tag); 
    ALog(@"%i", [[[tableView cellForRowAtIndexPath:indexPath] imageView] tag]); 

    UIImageView *iconimgView = (UIImageView *)[[tableView cellForRowAtIndexPath:indexPath] viewWithTag:TAG_IMAGEMARKERCELL]; 
    [iconimgView setImage:[UIImage imageNamed:@"circle-answer-marked.png"]]; 

    //.. 
} 

UIImageView определяется здесь:

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

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     //Add this to cell only once, not everytime a cell is displayed! (Everyhing goes in here) 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
     [[cell textLabel] setNumberOfLines:0]; // unlimited number of lines 
     [[cell textLabel] setLineBreakMode:NSLineBreakByWordWrapping]; 
     [[cell textLabel] setFont:[UIFont fontWithName:@"PTSans-Regular" size:33/2]]; 
     [[cell textLabel] setTextColor:[self colorFromHexString:COLOR_DEFAULT_TEXT_COLOR]]; 
     cell.indentationLevel = cell.indentationLevel + 2; 

     //  //Marker image 
     imgCell_Marker = [[UIImageView alloc]initWithFrame:CGRectMake(10, 22, 20, 20)]; 
     imgCell_Marker.image=[UIImage imageNamed:@"circle-answer.png"]; 
     imgCell_Marker.tag = TAG_IMAGEMARKERCELL; 
     ALog(@"%@", imgCell_Marker); 
     [cell.contentView addSubview:imgCell_Marker]; 
    } 

     //.. 
     return cell; 
} 

Нечетная вещь, у UIImageView s есть предопределенный tag, но если я хочу получить это в didSelectRowAtIndexPath, ее всегда «0». (значение по умолчанию tag)

Заранее спасибо.

ответ

0

У вас есть проблемы с несколькими фронтами.

Во-первых, информация, которая определяет, какое изображение должна отображаться, должна быть частью вашей модели. Итак, когда выбрана строка, установите флаг в своей модели, чтобы сказать, что этот элемент отмечен. В то же время найдите другие элементы, которые отмечены и отмените их. Теперь перезагрузите строки, которые были изменены. В cellForRowAtIndexPath обновите запрошенные ячейки, чтобы установить стандартное или альтернативное изображение на основе информации тега из модели.

Во-вторых, для вашего использования tag - вы смешиваетесь между imgCell_Marker и imageView. Когда вы делаете:

ALog(@"%i", [[[tableView cellForRowAtIndexPath:indexPath] imageView] tag]); 

вы запрашиваете по умолчанию imageView, поэтому tag всегда будет равна нулю. Вы должны использовать viewWithTag:TAG_IMAGEMARKERCELL, чтобы найти нужный образ.

+0

Спасибо за подсказку с помощью ALOG. Я знаю, что получил правильное значение от тега. – paskl

+0

Почему голос? – Wain

+0

Вам необходимо убедиться, что изображение всегда установлено на правильное значение. В настоящее время повторное использование ячеек разбивает ваш код. Вам необходимо пересмотреть свой подход и обновить модель данных. – Wain

7

Используйте этот блок кода:

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView reloadData]; 
    UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; 
    cell.imageView.image = [UIImage imageNamed:@"image.png"]; 
} 

Сначала вы устанавливаете все ваши клетки, чтобы их состояние по умолчанию, а затем изменить образ текущей ячейки.

+0

Это ничего не делало. Я даже попробовал это с переписыванием 'UIImageView' вне' if (cell == nil) '. – paskl

+0

Если вы хотите добавить изображение в свою ячейку, создайте пользовательский класс для UITableViewCell. Чем будет работать код. Следуйте этому руководству: http://www.appcoda.com/customize-table-view-cells-for-uitableview/ – etolstoy

+0

Решил его с ответом и Wain's. Благодарю. :) – paskl

0

От инспектора атрибутов установите аксессуар как «Check Mark» для вашего прототипа. Это решит вашу проблему. Не нужно менять изображение или что-то еще. дайте мне знать, если это не то, что вы хотите

+0

Мне нужно использовать пользовательское изображение. Поэтому встроенная функция CheckMark не сделает это для меня. Спасибо, тo. – paskl

0

Сделайте вашу жизнь легкой. Используйте UITableViewCell :: selectedBackgroundView, чтобы предварительно установить контент для выбранных сот.

+0

Как это мне поможет? Мне нужно переключить весь вид (видимая часть) из ячейки? Не могли бы вы уточнить, пожалуйста? – paskl

+0

Вы можете подключить UIView к backgroudnView. Когда вызывается SelectSellCell, будет показан backgroundView. Это хороший способ дать ячейкам полный контент/макет на выбранном. Другой способ заключается в подклассификации UITableViewCell и переопределении метода setSelected: animate :. –

0

Примечание: это идеально подходит в моем случае, так что вы, вероятно, не хотите использовать его в вашем случае (или позвольте мне объяснить вам, почему вы должны, когда вы находитесь в таком же положении, как и я)

код будет выглядеть, что теперь:

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

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
    [[cell textLabel] setNumberOfLines:0]; // unlimited number of lines 
    [[cell textLabel] setLineBreakMode:NSLineBreakByWordWrapping]; 
    [[cell textLabel] setFont:[UIFont fontWithName:@"PTSans-Regular" size:33/2]]; 
    [[cell textLabel] setTextColor:[self colorFromHexString:COLOR_DEFAULT_TEXT_COLOR]]; 
    cell.indentationLevel = cell.indentationLevel + 2; 

    //Marker image 
    imgCell_Marker = [[UIImageView alloc]initWithFrame:CGRectMake(10, 22, 20, 20)]; 
    imgCell_Marker.image=[UIImage imageNamed:@"circle-answer.png"]; 
    imgCell_Marker.tag = TAG_IMAGEMARKERCELL; 
    [cell.contentView addSubview:imgCell_Marker]; 

    //.. (more data here, just snipped it) 
    return cell; 
} 

Вот почему я использую это:

Я знаю, что мой массив, откуда данные для UITableView приходит от только в верхней части длиной 5 пунктов. Поэтому я могу просто удалить оператор if в моем методе cellForRowAtIndexPath моего UITableView. Это не повредит моему приложению (или тратит время процессора), потому что есть так мало дел, никто не знает.

Тем не менее, это решение является своеобразным уродливым. Но все в порядке (я думаю)

Смежные вопросы