UIButtons作为tableview中的复选框

时间:2013-12-02 21:31:19

标签: ios uitableview uibutton

我是Objective-C和Xcode的新手,所以请耐心等待。

我试图解决这个问题已经很多天了,并且限制自己不要发帖。我读过UIButtons与Tableview的帖子数量很多,我觉得我太愚蠢了解为什么这不起作用。

我想实现一个包含多列复选框的tableview:

  

1 item1复选框复选框
  2项2复选框复选框

请记住,我目前只尝试实施一列复选框。

我正在使用编码的UIButton并将其图像设置为我的一个图像:checkedImage.png,unCheckedImage.png

每个项目的一个字符串NSArray @“”(带有项目标题)和一个NSMutableArray BOOL(如果选中,则为值)。

问题:
滚动表格视图时,选中的按钮@index 1-4将丢失其选中的图像。指数5似乎保持不变,其他指数则没有那么多。

调试方法时:-(void)checkboxSelected:(id)sender似乎拖出了正确的@row(索引),bool变量似乎是正确的但是图像没有。

我的想法是UIButton改变了状态,所以我在所有ControlState上实现了buttonimage,没有发生任何差异。

代码:

#import "ViewController.h"

#define sectionCount  1
#define itemSection  0

@interface ViewController ()
{
    NSArray *items;
    NSMutableArray *itemsChecked;

    UITableView *_tableView;
}
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    items = @[@"1", @"2",@"3", @"4",@"5", @"6",@"7", @"8",@"9", @"10",@"11",     @"12",@"13", @"14"];
    itemsChecked = [[NSMutableArray alloc] init];
    for(int i = 0; i < 14; i++)
    {
        [itemsChecked addObject:[NSNumber numberWithBool:false]];
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
{
    _tableView = tableView;
    return sectionCount;
}

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

    switch(section)
    {
        case itemSection:
        {
            return [items count];
        }

        default:
            return 0;

    }
}

-(NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    switch (section)
    {
        case itemSection:
            return @"Items";
        default:
            return @"woot";
    }
}

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:@"itemCell"];



switch(indexPath.section)
{
    case itemSection:
        cell.textLabel.text = items[indexPath.row];
        break;
    default:
        cell.textLabel.text=@"Unknown";
}


static NSInteger checkboxTag = 123;
NSInteger x,y;x = 100; y = 10;

UIButton *checkbox = (UIButton *) [cell.contentView viewWithTag:checkboxTag];



if (!checkbox)
{
    checkbox = [[UIButton alloc] initWithFrame:(CGRectMake(x,y,20,20))];
                checkbox.tag = checkboxTag;
                [cell.contentView addSubview:checkbox];
}

[checkbox setImage:[UIImage imageNamed:@"notSelectedButton.png"]   forState:UIControlStateNormal];

checkbox.adjustsImageWhenHighlighted = YES;
[checkbox addTarget:self action:@selector(checkboxSelected:)   forControlEvents:UIControlEventTouchDown];

    return cell;
}

-(NSIndexPath *) GetCellFromTableView: (UITableView *)tableView Sender:(id)sender
{
    CGPoint position = [sender convertPoint:CGPointZero toView:tableView];
    NSIndexPath *indexPath = [tableView indexPathForRowAtPoint:position];
    return indexPath;//[tableView cellForRowAtIndexPath:indexPath];
}

-(void)checkboxSelected:(id)sender
{
    NSIndexPath *ip = [self GetCellFromTableView:_tableView Sender:sender];


    NSInteger row = ip.row;
    bool checked  = [[itemsChecked objectAtIndex:row] boolValue];

    if (checked)
    {
        [(UIButton *)sender setSelected:false];
        itemsChecked[row] = @NO;
        checked = NO;
    }
    else
    {
        [(UIButton *)sender setSelected:true];
        itemsChecked[row] = @YES;
        checked = YES;
    }

    UIButton* checkbox = sender;

    if (checked)
    {
        [checkbox setImage:[UIImage imageNamed:@"checkedButton.png"] forState:UIControlStateNormal];

        [checkbox setImage:[UIImage imageNamed:@"checkedButton.png"] forState:UIControlStateDisabled];
        [checkbox setImage:[UIImage imageNamed:@"checkedButton.png"] forState:UIControlStateApplication];
        [checkbox setImage:[UIImage imageNamed:@"checkedButton.png"] forState:UIControlStateHighlighted];
        [checkbox setImage:[UIImage imageNamed:@"checkedButton.png"] forState:UIControlStateReserved];
        [checkbox setImage:[UIImage imageNamed:@"checkedButton.png"] forState:UIControlStateSelected];
    }
    else
    {
        //[checkbox setImage:[UIImage imageNamed:@"notSelectedButton.png"] forState:UIControlStateNormal];
    }

}
@end

标题

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDataSource>

- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView;

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

- (NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;

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

-(UITableViewCell *) GetCellFromTableView: (UITableView *)tableView Sender:(id)sender;

-(void)checkboxSelected:(id)sender;
@end

1 个答案:

答案 0 :(得分:2)

1)不要使items成为字符串数组,使其成为包含要显示的字符串的自定义对象数组,以及记住是否已选中的BOOL成员变量或不。

2)仅在cellForRowAtIndexPath方法中设置图像,而不是在其他方法中设置图像,并根据上述BOOL变量的状态以不同方式设置图像。

3)当所选状态由于您的操作方法(或其他)而发生变化时,它应该只更改BOOL状态变量,然后告诉表视图重新加载其数据(这将触发cellForRowAtIndexPath )。