如何在UITableViewCell上保存按钮选择?

时间:2015-10-07 05:38:03

标签: ios uitableview

我的应用程序有一个最喜欢的按钮,点击它转换成红色的心脏,如果我点击againg然后它回到灰色的心脏。它的工作正确。但是问题reuseIdentifier,滚动后,按钮刚刚进入原始状态,因为它在此处重复使用单元格。

如何保存选择按钮以使其保持选中状态(如果已选择)

tableViewCell类的代码(.h文件):

#import <UIKit/UIKit.h>

@interface favBTNTableViewCell : UITableViewCell


@property(nonatomic)UIButton *faVbtn;

@end

tableViewCell类的代码(.m文件)

#import "favBTNTableViewCell.h"

@implementation favBTNTableViewCell
@synthesize faVbtn;
-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(nullable NSString *)reuseIdentifier
{

    self=[super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if(self)
    {

        faVbtn=[UIButton new];
        [faVbtn setFrame:CGRectMake(10, 10, 25, 25)];
        [faVbtn setBackgroundImage:[UIImage imageNamed:@"unsel"] forState:UIControlStateNormal];
        [faVbtn addTarget:self action:@selector(clickOnfav) forControlEvents:UIControlEventTouchUpInside];
        [faVbtn setSelected:YES];


        [self.contentView addSubview:faVbtn];
    }
    return  self;
}
-(void)clickOnfav
{

     if ([faVbtn isSelected]) {
      [faVbtn setBackgroundImage:[UIImage imageNamed:@"sel.jpg"] forState:UIControlStateNormal];
      [faVbtn setSelected:NO];


        }
    else
        {
        [faVbtn setSelected:YES];
        [faVbtn setBackgroundImage:[UIImage imageNamed:@"unsel"] forState:UIControlStateNormal];
        }

}

ViewContrller.m代码

#import "ViewController.h"
#import "favBTNTableViewCell.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
    NSString *ci;
}
@property (strong, nonatomic) IBOutlet UITableView *tv;

@end

@implementation ViewController

-(NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    return 30;
}
-(UITableViewCell*)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath
{
    favBTNTableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ci];

    if(!cell)

    {
        cell=[[favBTNTableViewCell alloc]init];
        cell.faVbtn.tag=indexPath.row;

    }
    return cell;


}
- (void)viewDidLoad {
    _tv.delegate=self;
    _tv.dataSource=self;

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

3 个答案:

答案 0 :(得分:0)

您的单元格需要相应的数据源。例如,您可以创建一个类,并将其用作数据源项。看看:

@interface DataSourceItem : NSObject
@property (nonatomic, assign) BOOL isFavorite;
@end

@implementation DataSourceItem
@end

然后在视图控制器的代码中,您需要填充数据源项目数组并根据此数组管理表视图:

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
    NSString *ci;
}
@property (strong, nonatomic) IBOutlet UITableView *tv;
@property (strong, nonatomic) NSArray *dataSourceArray;

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];
        _tv.delegate=self;
    _tv.dataSource=self;

    NSMutableArray *temp = [NSMutableArray new];
    // actually how many rows you table view need to have
    for (NSUInteger i = 0; i < 30; i++)
    {
        [temp addObject:[DataSourceItem new]];
    }
    self.dataSourceArray = [temp copy];**
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     // change dataSource item state
     DataSourceItem *item = [self.dataSourceArray objectAtIndex:indexPath.row];
    item.isFavorite = !item.isFavorite;
    // change cell state 
     favBTNTableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    cell.faVbtn.selected = item.isFavorite;
}

-(NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    return [self.dataSource count];
}
-(UITableViewCell*)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath
{
    favBTNTableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ci];

    if(!cell)

    {
        cell=[[favBTNTableViewCell alloc]init];
        cell.faVbtn.tag=indexPath.row;

    }

    // decision based on data source item state
    cell.favBtn.selected = self.dataSource[indexPath.row];
    return cell;


}

答案 1 :(得分:0)

你可以这样解决:

  1. 在自定义单元格中实施- (void)layoutSubviews方法。
  2. - (void)layoutSubviews中,检查按钮状态,然后设置 正确的形象:
  3. - &GT;

    - (void)layoutSubviews {
        [super layoutSubviews];
    
        UIImage *buttonImage = [faVbtn isSelected] ? [UIImage imageNamed:@"sel.jpg"] : [UIImage imageNamed:@"unsel"];
        [faVbtn setBackgroundImage:buttonImage forState:UIControlStateNormal];
    }
    

答案 2 :(得分:0)

如果您使用自定义单元格 在载荷中为你的tableview注册class / nib

[tblName registerNib:[UINib nibWithNibName:@"customCell" bundle:nil] forCellReuseIdentifier:@"customCell"];

此后在数据源方法

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
    customCell *cell =(customCell*) [tableView dequeueReusableCellWithIdentifier:@"customCell" forIndexPath:indexPath];
    // your code here
    return cell;
}

不要忘记将您的小区标识符指定为&#34; customCell&#34;在单元属性中 快乐的编码..

你也可以通过我检查类似的问题 Iphone: Checkmarks in UITableview get mixed up when scrolling