如何在 UITableViewCell 中设置 UIButton 状态?

Posted

技术标签:

【中文标题】如何在 UITableViewCell 中设置 UIButton 状态?【英文标题】:How to UIButton state in UITableViewCell? 【发布时间】:2013-10-11 17:54:57 【问题描述】:

有没有办法控制UIButton 中的UIButton 状态(启用/禁用按钮)。我的问题是我在单元格中的UIButton 是在storyboard 中使用viewWithTag 制作的。我已经花了很多时间来整理它,但没有运气。人们大多通过以编程方式为带有单元格indexPath 的按钮分配标签来解决问题。

我知道表格会重复使用单元格,但我只是想问一下是否还有另一种解决问题的方法。如果不可能,我可能必须以编程方式创建按钮。

【问题讨论】:

“状态”是什么意思? 我想在点击时禁用按钮。但问题是单元格是重复使用的,所以当我向下滚动表格视图时,其他单元格的按钮也将无法单击。 您有自定义单元格? @MirkoCatalano 我在storyboard 上设计单元,但没有专门的单元类。在-tableView:cellForRowAtIndexPath: 中,我使用带有UIButton *btn = (UIButton *)[cell.contentView viewWithTag:100] 的按钮。并在单击按钮时有一个-setEnable: 的方法。 这是错误的,如果您制作自定义单元格,一切都会变得简单,并且可以使用 prepareToReuse 方法解决您的问题 【参考方案1】:

您可以遍历单元格的所有子视图并检查它们是否是 UIButton 使用 isMemberOfClass 来获取您的按钮。如果您有多个按钮,则可以检查按钮的文本或唯一标识它的其他属性。这将是一种 hacky 方式。

【讨论】:

我之前也尝试过您的解决方案,但它不起作用。当我单击按钮时,该行上的按钮被禁用,但是当向下滚动时,单元格被重用,其他行中的一些按钮也被禁用:(。这是因为我的按钮标签未设置为对应于indexPath . 正如我所提到的,我只是使用storyboard 创建了一个按钮,并由-viewWithTag: 使用它【参考方案2】:

你必须像这样制作一个自定义单元格:

CustomCell.h

@protocol CustomCellDelegate <NSObject>

- (void)buttonPressed:(UIButton *)sender;


@end
#import <UIKit/UIKit.h>

@interface CustomCell : UITableViewCell

@property (weak, nonatomic) id<CustomCellDelegate> delegate;
@property (weak, nonatomic) IBOutlet UIButton *button;

- (IBAction)buttonPressed:(UIButton *)sender;
@end

CustomCell.m

#import "CustomCell.h"

@implementation CustomCell

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
    
    return self;


-(void)prepareForReuse
    self.button.enable = YES;



- (IBAction)buttonPressed:(UIButton *)sender
[self.delegate buttonPressed:sender];

@end

在 IB 中,您在 UITableView 中添加一个新的 UITableViewCell 并将它的类与您的新自定义单元格一起设置识别 ID,如“CustomCell”,将您的按钮添加到您的自定义单元格并连接 Outlet,然后修改您的 tableView: cellForRowAtIndexPath: 像这样:

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  
static NSString *CellIdentifier=@"CustomCell";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

 cell.delegate = self;

return cell;


- (void)buttonPressed:(UIButton *)sender
sender.enable = NO;

您还必须在控制器的加热器文件中添加 CustomCellDelegate

【讨论】:

Tks 为您提供详细的解决方案,我试过了,但没有用。每当重用单元格时,按钮状态都会重置【参考方案3】:

一种简单的方法是在视图控制器中保留一个 NSMutableArray 变量,并以此跟踪哪些单元格按钮被禁用/启用。并使用 UITableViewDataDelegate 方法:

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

设置按钮每次显示时的状态。以及 UITableViewDelegate 方法:

– tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)tableViewCell forRowAtIndexPath:(NSIndexPath *)indexPath

写入数组。使用 indexPath 进行索引。

【讨论】:

以上是关于如何在 UITableViewCell 中设置 UIButton 状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UITableViewCell 中设置 UIButton 状态?

如何在swift中设置自定义UITableviewcell的动态高度

如何在 iOS 中使用 CAGradientLayer 在 UITableViewCell 中设置多个渐变颜色?

如何使用 AutoLayout 在一个 UITableView 中设置具有两个原型的 UITableViewCell 的 AutoHeight?

如何使用自动布局在一个宽度相同的 uitableviewcell 中设置八个 uilabel

在 UITableViewCell 中设置 textLabel 的宽度