Кнопки UITableView подсвечиваются при прокрутке

#ios #objective-c #uibutton #delegates #swift-protocols

#iOS #objective-c #uitableview #uibutton

Вопрос:

У меня есть кнопки переключения в ячейках tableview, и я нажимаю на них для некоторых ячеек, но когда я прокручиваю вниз, те же кнопки выбираются и для нижних ячеек, хотя я их еще не выбирал. Я знаю, что это происходит из-за повторного использования tableview cells…is я могу как-нибудь это исправить?

Ячейки являются динамическими, а не статическими.

как выглядит tableview

** РЕДАКТИРОВАТЬ: Кроме того, дайте мне знать, кажется ли моя логика правильной: я попытался создать изменяемый массив в моем классе viewcontroller, а затем установить все его значения в @»0″. Затем в моем классе tableviewcell я устанавливаю значение в массиве равным @»1″ по индексу текущей ячейки, если я выбираю кнопку, поэтому, вернувшись в свой класс viewcontroller, я могу определить, выбрал ли я уже кнопку в этой ячейке или нет. Единственный недостаток заключается в том, что я не могу получить доступ к массиву в классе моего tableviewcell, он отображается с нулевым значением … я предполагаю, что это из-за шаблона mvc в objective c. Любой совет?

Редактировать

Я все еще не могу решить свою проблему. Может кто-нибудь, пожалуйста, помочь мне? Я застрял на этом некоторое время!

Я пытаюсь создать tableview, где в ячейках есть кнопка проверки и перекрестия, и когда я нажимаю кнопку проверки, она должна стать зеленой, но та же кнопка в других ячейках должна оставаться серой, однако, когда я прокручиваю вниз, некоторые ячейки, в которых я не выбирал кнопки, все еще становятся зелеными…из-за рециркуляции ячеек.

Я использую делегаты и протоколы прямо сейчас, но это не работает; возможно, я использую это неправильно?

Я устанавливаю значение yesChecked в функциях IBAction в моем классе cell, и в моем классе viewcontroller я использую это значение yesChecked, чтобы увидеть, какой цвет придать кнопке, в зависимости от того, говорит ли она «да» или «нет».

Пожалуйста, помогите! Спасибо!

 @protocol DetailsTableViewCellDelegate <NSObject>

- (void) customCell:(DetailsTableViewCell *)cell yesBtnPressed:(bool)yes;

@property (nonatomic, retain) NSString * yesChecked;
  

Ответ №1:

Вам придется выбрать или отменить их выбор в cellForRowAt . Например, если у вашей ячейки было leftButton свойство и у вас была подобная модель, вы могли бы сделать что-то вроде следующего:

 @interface Model : NSObject

@property (nonatomic, assign) BOOL selected;

@end
  
 @protocol CustomCellDelegate <NSObject>

- (void)cellActionTapped:(UITableViewCell *)cell;

@end
  
 @interface CustomCell : UITableViewCell

@property (nonatomic, assign) BOOL leftButtonSelected;
@property (weak, nonatomic, nullable) id<CustomCellDelegate> delegate;

@end
  
 // ModelViewController.h
@interface ModelViewController : UIViewController<CustomCellDelegate>

@end
  
 // ModelViewController.m
@interface ViewController () {
    NSArray<Model*>* models;
}

@end
  
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuseIdentifier"];
    ((CustomCell *)cell).delegate = self;
    ((CustomCell *)cell).leftButtonSelected = models[indexPath.row].selected;
    return cell;
}

- (void)cellActionTapped:(UITableViewCell *)cell {
    NSIndexPath *indexPath = [tableView indexPathForCell:cell];
    // Update data source using (maybe) indexPath.row
}
  

Комментарии:

1. Спасибо! но я использую objective-c

2. Кроме того, дайте мне знать, кажется ли моя логика правильной: я попытался создать изменяемый массив в моем классе viewcontroller, а затем установить все его значения в @»0″. Затем в моем классе tableviewcell я устанавливаю значение в массиве равным @»1″ по индексу текущей ячейки, если я выбираю кнопку, поэтому, вернувшись в свой класс viewcontroller, я могу определить, выбрал ли я уже кнопку в этой ячейке или нет. Единственный недостаток заключается в том, что я не могу получить доступ к массиву в классе моего tableviewcell, он отображается с нулевым значением … я предполагаю, что это из-за шаблона mvc в objective c. Любой совет?

3. В Obj-C это в основном то же самое, но я обновил свой ответ. Вы должны реализовать делегат в своих ячейках, чтобы нажатие в вашей ячейке обновляло источник данных в ViewController. Наличие источника данных на уровне ячейки не сработает, учитывая многократно используемый характер ячеек.

4. Привет, спасибо за ваш ответ! Извините, что снова беспокою вас, у меня возникли проблемы с определением делегата для ячейки, можете ли вы предоставить мне какой-нибудь пример кода или отправить полезную ссылку?

5. Я обновил ответ, включив в него пример делегата. Вам придется изменить параметры и логику в зависимости от того, чего вы хотите достичь, но я думаю, что это даст вам общее представление о подходе.