Выбранные кнопки UITableViewCell меняются на невыбранное состояние после прокрутки UITableView

Действие кнопки – SongsSelectionSongs_Click . Когда я нажимаю на эту кнопку, меняется изображение кнопки, подсчет нажатий кнопки становится правильным, и после того, как выбранные изображения кнопок также меняются, но когда я прокручиваю назад и вперед в UITableView , изображение кнопки кажется случайным образом меняющимся.

введите описание изображения здесь

Это мой код:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"SongsTAbleViewCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if(cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SongsTAbleViewCell" owner:self options:nil]; cell = [nib objectAtIndex:0]; } btn_songSelect.tag = indexPath.row; lbl_songLabel.text = [[arr_tablVArray objectAtIndex:indexPath.row] objectForKey:@"SongTitle"]; lbl_artistLabel.text = [[arr_tablVArray objectAtIndex:indexPath.row] objectForKey:@"SongArtist"]; return cell; } -(IBAction)SongsSelectionSongs_Click:(id)sender { UIButton *button = sender; CGPoint correctedPoint = [button convertPoint:button.bounds.origin toView:self.tblv_SongslisttableView]; NSIndexPath *indexPath = [self.tblv_SongslisttableView indexPathForRowAtPoint:correctedPoint]; NSLog(@"Button tapped in row %d",indexPath.row); SelectedAlbumUrl = [[arr_tablVArray objectAtIndex:indexPath.row] objectForKey:@"SongUrl"]; str_songtitle = [[arr_tablVArray objectAtIndex:indexPath.row] objectForKey:@"SongTitle"]; if ([[button backgroundImageForState:UIControlStateNormal] isEqual:[UIImage imageNamed:@"add.png"]]) { btn_songsShareButton.userInteractionEnabled = YES; [btn_songSelect setBackgroundImage:[UIImage imageNamed:@"remove.png"] forState:UIControlStateNormal]; buttonStatus = buttonStatus +1; [btn_songsShareButton setImage:[UIImage imageNamed:@"share selected.png"] forState:UIControlStateNormal]; } else { [btn_songSelect setBackgroundImage:[UIImage imageNamed:@"add.png"] forState:UIControlStateNormal]; buttonStatus = 1; [btn_songsShareButton setImage:[UIImage imageNamed:@"share unselected.png"] forState:UIControlStateNormal]; } } 

3 Solutions collect form web for “Выбранные кнопки UITableViewCell меняются на невыбранное состояние после прокрутки UITableView”

// Попробуйте, он работает нормально

pragma .h Файл

 NSMutableArray * rowIdArray; 

Файл прагмы .M

 @synthesize rowIdArray; - (void)viewDidLoad { rowIdArray=[[NSMutableArray alloc]init]; } -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [NamesArray count]; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; ViewControllerCell *cell = (ViewControllerCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if(cell == nil) { NSArray *nib; nib = [[NSBundle mainBundle] loadNibNamed:@"ViewControllerCell" owner:self options:nil]; cell = [nib objectAtIndex:0]; } // Configure the cell... cell.nameslbl.text = [NamesArray objectAtIndex:indexPath.row]; cell.nameBtn.tag=indexPath.row; [cell.nameBtn addTarget:self action:@selector(NamesClick_Tapped:) forControlEvents:UIControlEventTouchUpInside]; NSString *a=[NSString stringWithFormat:@"%d", indexPath.row]; NSString *b=[[NSString alloc]init]; for (int i=0;i<[rowIdArray count];i++) { b=[rowIdArray objectAtIndex:i]; if ([a isEqualToString:b]) { UIImage *buttonImage = [UIImage imageNamed:@"star_selected.png"]; [cell.nameBtn setBackgroundImage:buttonImage forState:UIControlStateNormal]; } } return cell; } -(IBAction)NamesClick_Tapped:(id)sender { CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.NameTableView]; NSIndexPath *indexPath = [self.NameTableView indexPathForRowAtPoint:buttonPosition]; NSString *rowIdStr = [NSString stringWithFormat:@"%d", indexPath.row]; if(![rowIdArray containsObject:rowIdStr]) { [rowIdArray addObject:rowIdStr]; }else{ [rowIdArray removeObject: rowIdStr]; } [self.NameTableView reloadData]; } 

Вы не делаете ничего в своем cellForRowAtIndexPath чтобы выбрать или отменить выбор изображения. Когда вы повторно используете ячейку, она не изменяет состояние ячейки, если вы явно не cellForRow ее в cellForRow . Поэтому он будет либо повторно использовать выбранную или отмененную ячейку (независимо от первой доступной ячейки многократного использования), и поместить ее на экран как есть.

Чтобы исправить эту проблему, в вашем методе cellForRowAtIndexPath вам понадобится логика, чтобы выбрать или отменить выбор изображения на основе того, что подходит.


В общем, если ваша проблема имеет какое-либо отношение к тому, что «мои ячейки не отображаются правильно при прокрутке», вы не правильно используете свои ячейки.

EDIT: в ответ на ваш комментарий нет , я не буду переписывать ваш код. Но я дам вам какое-то направление.

Я бы рекомендовал сохранить дополнительный ключ / значение в вашем arr_tablVArray который будет отслеживать, включать или отключать «share» (я бы предложил значение bool ). Это сделало бы это так, чтобы вы могли проверить, включено или отключено «share», проверяя bool вместо проверки содержимого изображения кнопки в методе IBAction .

Эта информация теперь будет доступна и в вашем методе cellForRowAtIndexPath , и вы можете проверить значение для текущей записи в arr_tablVArray и соответственно настроить свои изображения так же, как вы установили lbl_songLabel и lbl_artistLabel .

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

  • Как создать пользовательский UITableViewCell программно, используя AutoLayout
  • ViewController, наблюдающий за отсутствием свойства объекта
  • отправка текущего местоположения на сервер в фоновом режиме, а также в запуске приложения с использованием AFNetworking 3
  • Не разрешать взаимодействие пользователя, когда вид индикатора активности
  • Изменение экрана блокировки iphone программно, когда приложение работает в фоновом режиме
  • Анимация UITableViewCell останавливается при прокрутке UITableView
  • UITableview Не прокрутка?
  • Как отобразить описание предмета покупки в приложении?
  • iPhone: Как вы экспортируете SecKeyRef или NSData, содержащие биты открытого ключа в формат PEM?
  • NSSortDescriptor - сортировка по местоположению
  • iOS - Добавить пункт меню в Safari «Открыть с помощью»
  • Interesting Posts

    Почему свойство selectedCalendars для EKCalendarChooser равно нулю?

    Жест: не удалось получить уведомление о состоянии жесты системы перед следующим касанием – на удержании

    Как устройства соединены в CoreBluetooth?

    Не удается запустить приложение на iPhone

    NSDateFormatter в 12-часовом режиме

    Как сделать «серийную» анимацию с GCD?

    UIButton не будет седым

    Акселерометр работает, когда для приложения IOS

    Обмен данными между различными приложениями на одном устройстве iOS

    Получите ошибку EXC_BAD_ACCESS после добавления viewcontroller'view в качестве subView к другому представлению viewcontroller?

    Черный симулятор экрана при обновлении до Swift 3.0 и Xcode 8

    Есть ли способ узнать, какой метод вызывается, когда я нажимаю кнопку

    iOS: воспроизведение пакетов RTP с использованием аудиоустройства

    Добавление поддержки отображения сетчатки в OpenGL ES, не рисующем ничего

    Автоматический макет визуального языка программирования для массива представлений

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.