滚动UITableList时更改复选框位置

时间:2016-07-08 07:21:40

标签: ios objective-c uitableview

我在tableList上插入一个Button进行检查并取消选中产品,为此我使用了下面的代码,但是当我滚动我的tableList时,已经选中的框已经取消检查并且它们的位置也在改变

我该如何解决这个问题?

我的代码:

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

    return 1;
}

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

    return mainArray.count;
}

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

    static NSString *cellIdentifier = @"HistoryCell";

    UITableViewCell *cell = (UITableViewCell *)[MaintableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil){

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

    }

    model1 = mainArray[indexPath.row];


    newBtn=[UIButton buttonWithType:UIButtonTypeCustom];
    [newBtn setFrame:CGRectMake(250,5,30,30)];
    [newBtn addTarget:self action:@selector(urSelctor:) forControlEvents:UIControlEventTouchUpInside];

    UIImage *btnImage;
    if(model1.ischeck){
        btnImage = [UIImage imageNamed:@"check.png"];
    }else{
        btnImage = [UIImage imageNamed:@"uncheck.png"];
    }
    [newBtn setImage:btnImage forState:UIControlStateNormal];

    [cell addSubview:newBtn];

    return cell;
}

-(void)urSelctor :(UIButton*)sender{

    CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:MaintableView];
    NSIndexPath *indexPath1 = [MaintableView indexPathForRowAtPoint:buttonPosition];
    NSInteger variable = indexPath1.row;
    model1 = mainArray[variable];

    if (model1.ischeck){
        model1.ischeck = NO;
        [mainArray replaceObjectAtIndex:variable withObject:model1];
forState:UIControlStateNormal];
    }
    else{
        model1.ischeck = YES;
        [mainArray replaceObjectAtIndex:variable withObject:model1];
forState:UIControlStateNormal];
    }

    [MaintableView reloadData];
}

@end

modelObject: -

@interface ModelObject1 : NSObject{
    BOOL  ischeck;
}

@property(nonatomic) BOOL ischeck;

@end

4 个答案:

答案 0 :(得分:0)

试试这个:

if (cell == nil){
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
}

修改reuseIdentifier is nil然后尝试。

答案 1 :(得分:0)

最好的方法是定义自定义的tableview单元格。

如果您只想对代码进行简单更改,请移除dequeueReusableCellWithIdentifier调用,然后创建新单元格。这不是最好的主意,但它会使您的代码正常工作。

UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

答案 2 :(得分:0)

您可以创建一个UITableViewCell类型的自定义单元格。它会解决你的问题。当你每次在cellForRow中添加新的按钮对象时。它还会消耗更多内存。如果不需要太多,请不要在cellForRow中添加子视图。

参见我在本演示中所做的事情:

https://sendspace.com/file/vjzu74

答案 3 :(得分:0)

您可以使用此代码:

-(void)btnPressed :(id)sender
{
    CGPoint point=[sender convertPoint:CGPointZero toView:self.tableView];
    NSIndexPath *index= [self.tableView indexPathForRowAtPoint:point];
    UITableViewCell *cell=[self.tableView cellForRowAtIndexPath:index];
    [category manageCell:index.row];
    [self.tableView reloadRowsAtIndexPaths:@[index] withRowAnimation:UITableViewRowAnimationAutomatic];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *const cellIdentifier=@"cell";
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if(cell==nil)
    {
        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier ];
    }
    UIButton *checkBtn=[cell.contentView viewWithTag:100];
    [checkBtn addTarget:self action:@selector(btnPressed:) forControlEvents:UIControlEventTouchUpInside];
    if([category.indexArray containsObject:[NSNumber numberWithInteger:indexPath.row]])
    {

        [checkBtn setImage:[UIImage imageNamed:@"check"] forState:UIControlStateNormal];
    }
    else
    {
        [checkBtn setImage:[UIImage imageNamed:@"uncheck"] forState:UIControlStateNormal];
    }
    return cell;
}


-(void)manageCell:(NSInteger)index
{
    if(![_indexArray containsObject:[NSNumber numberWithInteger:index]])
    {
        [_indexArray addObject:[NSNumber numberWithInteger:index]];
    }
    else
    {
        [_indexArray removeObject:[NSNumber numberWithInteger:index]];

    }
       NSLog(@"%@",_indexArray);
}