UITableview 按钮在滚动时突出显示
UITableview buttons getting highlighted on scroll
我的 tableview 单元格中有切换按钮,我在某些单元格上单击它们,但是当我向下滚动时,这些相同的按钮也被 select 用于底部单元格,即使我没有 select他们呢。我知道发生这种情况是因为 tableview 重用了单元格...有什么办法可以解决这个问题吗?
细胞是动态的,不是静态的。
表格视图是什么样的
** 编辑:另外,让我知道我的逻辑是否正确:我尝试在我的 viewcontroller class 中创建一个可变数组,然后将其所有值设置为 @"0"。然后,在我的 tableviewcell 的 class 中,如果我 select 按钮,我将数组中的值设置为当前单元格索引处的 @"1",然后返回我的 viewcontroller class,我可以判断我是否已经 select 在该单元格中编辑了一个按钮。唯一的缺陷是我无法访问我的 tableviewcell 的 class 中的数组,它在 null 处出现...我猜这是因为 objective c 中的 mvc 模式。有什么建议吗?
编辑
我仍然无法解决我的问题。有人可以帮帮我吗?我已经坚持了一段时间了!
我正在尝试创建一个表格视图,其中的单元格有一个复选按钮和十字按钮,当我单击复选按钮时,它应该变成绿色,但是当我滚动时,其他单元格中的相同按钮应该保持灰色下来,一些我没有 select 按钮的电池仍然变成绿色......因为电池回收。
我现在正在使用委托和协议,但它不起作用;也许我用错了?
我在单元格 class 的 IBaction 函数中设置 yesChecked 值,在我的 viewcontroller class 中,我使用 yesChecked 值来查看要为按钮取决于它是说“是”还是“否”。
求助!谢谢!
@protocol DetailsTableViewCellDelegate <NSObject>
- (void) customCell:(DetailsTableViewCell *)cell yesBtnPressed:(bool)yes;
@property (nonatomic, retain) NSString * yesChecked;
您必须在 cellForRowAt
中 select 或删除 select 它们。例如,如果您的单元格有一个 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
}
我的 tableview 单元格中有切换按钮,我在某些单元格上单击它们,但是当我向下滚动时,这些相同的按钮也被 select 用于底部单元格,即使我没有 select他们呢。我知道发生这种情况是因为 tableview 重用了单元格...有什么办法可以解决这个问题吗?
细胞是动态的,不是静态的。
表格视图是什么样的
** 编辑:另外,让我知道我的逻辑是否正确:我尝试在我的 viewcontroller class 中创建一个可变数组,然后将其所有值设置为 @"0"。然后,在我的 tableviewcell 的 class 中,如果我 select 按钮,我将数组中的值设置为当前单元格索引处的 @"1",然后返回我的 viewcontroller class,我可以判断我是否已经 select 在该单元格中编辑了一个按钮。唯一的缺陷是我无法访问我的 tableviewcell 的 class 中的数组,它在 null 处出现...我猜这是因为 objective c 中的 mvc 模式。有什么建议吗?
编辑
我仍然无法解决我的问题。有人可以帮帮我吗?我已经坚持了一段时间了!
我正在尝试创建一个表格视图,其中的单元格有一个复选按钮和十字按钮,当我单击复选按钮时,它应该变成绿色,但是当我滚动时,其他单元格中的相同按钮应该保持灰色下来,一些我没有 select 按钮的电池仍然变成绿色......因为电池回收。
我现在正在使用委托和协议,但它不起作用;也许我用错了?
我在单元格 class 的 IBaction 函数中设置 yesChecked 值,在我的 viewcontroller class 中,我使用 yesChecked 值来查看要为按钮取决于它是说“是”还是“否”。
求助!谢谢!
@protocol DetailsTableViewCellDelegate <NSObject>
- (void) customCell:(DetailsTableViewCell *)cell yesBtnPressed:(bool)yes;
@property (nonatomic, retain) NSString * yesChecked;
您必须在 cellForRowAt
中 select 或删除 select 它们。例如,如果您的单元格有一个 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
}