#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. Я обновил ответ, включив в него пример делегата. Вам придется изменить параметры и логику в зависимости от того, чего вы хотите достичь, но я думаю, что это даст вам общее представление о подходе.