UItableView Replacing Checkmarks with UIButton

旧城冷巷雨未停 提交于 2020-01-04 14:00:56

问题


I just want to use UIButton instead check marks im successful in adding button and making it working as check mark when row selected but only row selection is working button not wise not i want to make it work button as well as cell selection screenshot:

http://i.imgur.com/aXiBsfU.png

http://i.imgur.com/hQddEGk.png

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row==0)
{
    if (selectAll==0)
    {
        selectAll=1;
        [self.arrForIndPaths removeAllObjects];
    }
    else
    {
        selectAll=0;
        [self.arrForIndPaths removeAllObjects];
    }
}
else
{
    if (selectAll!=1)
    {
        if([self.arrForIndPaths containsObject:indexPath])
        {
            [self.arrForIndPaths removeObject:indexPath];
        }
        else
        {
            [self.arrForIndPaths addObject:indexPath];
        }
    }
    else
    {
        selectAll=0;
        if([self.arrForIndPaths containsObject:indexPath])
        {
            [self.arrForIndPaths removeObject:indexPath];
        }
        else
        {[self.arrForIndPaths addObject:indexPath];}}}[tableView reloadData];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static const NSInteger btnTag = 1;
static NSString *MyIdentifier = @"SearchResult";
UITableViewCell *cell;
if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];
}
UILabel *lblText = [[UILabel alloc]initWithFrame:CGRectMake(40, 0, 400, 55)];
UIButton *btnCheck = [[UIButton alloc]initWithFrame:CGRectMake(845, 10, 35, 28)];
btnCheck.contentVerticalAlignment = UIControlContentVerticalAlignmentBottom;
btnCheck.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
[btnCheck setImage:[UIImage imageNamed:@"checkbox_white.png"] forState:UIControlStateNormal];
[btnCheck setImage:[UIImage imageNamed:@"checked_white.png"] forState:UIControlStateSelected];
[btnCheck setImage:[UIImage imageNamed:@"checked_white.png"] forState:UIControlStateHighlighted];
[btnCheck addTarget:self action:@selector(doneBtn:) forControlEvents:UIControlEventTouchUpInside];
btnCheck.tag = btnTag;
[cell.contentView addSubview:lblText];
[cell addSubview:btnCheck];
if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
{
    if (indexPath.row==0)
    {
        lblText.textColor =[self colorWithHexString:@"333333"];
        lblText.font=[UIFont fontWithName:@"VERDANA" size:30];
    }
    else
    {
        lblText.textColor=[self colorWithHexString:@"333333"];
        lblText.font=[UIFont fontWithName:@"VERDANA" size:20];
    }
}
else
{
    if (indexPath.row==0)
    {
        lblText.textColor=[self colorWithHexString:@"333333"];
        lblText.font=[UIFont fontWithName:@"VERDANA" size:18];
    }
    else
    {
        lblText.textColor=[self colorWithHexString:@"333333"];
        lblText.font=[UIFont fontWithName:@"VERDANA" size:16];
    }
}
lblText.text=[arrFacilities objectAtIndex:indexPath.row];
lblText.textAlignment=NSTextAlignmentLeft;
if (selectAll==1)
{
    [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
    [btnCheck setImage:[UIImage imageNamed:@"checked_white.png"] forState:UIControlStateNormal];
}
else
{
    if([self.arrForIndPaths containsObject:indexPath])
    {
        [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
        [btnCheck setImage:[UIImage imageNamed:@"checked_white.png"] forState:UIControlStateNormal];
    }
    else
    {
        [cell setAccessoryType:UITableViewCellAccessoryNone];
        [btnCheck setImage:[UIImage imageNamed:@"checkbox_white.png"]forState:UIControlStateNormal];
    }
}
cell.textLabel.numberOfLines=0;
cell.textLabel.lineBreakMode=NSLineBreakByWordWrapping;
return cell;
}
- (void)doneBtn:(UIButton*)sender
{
UIButton *btn = (UIButton*)sender;
}

Thanks in Advance.


回答1:


globally declare these variables

BOOL isSelectedAll;
NSMutableArray *arraySelectedRows;
int allDataCount; // this may be your arrayWithData.count

in 'viewDidLoad'

isSelectedAll = NO;
allDataCount = 10;
arraySelectedRows = [[NSMutableArray alloc]init];

in 'cellForRowAtIndexPath'

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ce" forIndexPath:indexPath];
CustomTableViewCell *cell = [[CustomTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cee"];
cell.textLabel.text = @"Test";
UIButton *buttonSelection = [[UIButton alloc]initWithFrame:CGRectMake(tableView.frame.size.width - 100, 8, 50, 50)];
buttonSelection.tag = indexPath.row;
if(isSelectedAll)
{
    [buttonSelection setImage:[UIImage imageNamed:@"tick"] forState:UIControlStateNormal];//Rename imageName as yours
}
else if([arraySelectedRows containsObject:indexPath]&&indexPath.row!=0)
{
    [buttonSelection setImage:[UIImage imageNamed:@"tick"] forState:UIControlStateNormal];//Rename imageName as yours
}
else
{
    [buttonSelection setImage:[UIImage imageNamed:@"untick"] forState:UIControlStateNormal];//Rename imageName as yours
}

[buttonSelection addTarget:self action:@selector(selectionButtonAction:) forControlEvents:UIControlEventTouchUpInside];
[cell addSubview:buttonSelection];
return cell;
}

in 'didSelectRowAtIndexPath'

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:     (NSIndexPath *)indexPath
{
if (indexPath.row == 0)
{
    //select all button
    if (isSelectedAll)
    {
        isSelectedAll = NO;
        [arraySelectedRows removeAllObjects];
    }
    else
    {
        [arraySelectedRows removeAllObjects];
        for (int i = 1; i<allDataCount; i++)
        {
            [arraySelectedRows addObject:[NSIndexPath indexPathForRow:i inSection:0]];//section number may be defer for you
        }
        isSelectedAll = YES;
    }
}
else
{
    if([arraySelectedRows containsObject:indexPath])
    {
        [arraySelectedRows removeObject:indexPath];

    }
    else
    {
        [arraySelectedRows addObject:indexPath];
    }
    if ((allDataCount - 1) == arraySelectedRows.count)
    {
        isSelectedAll = YES;
    }
    else
    {
        isSelectedAll = NO;
    }
}
[self.tableView reloadData];
}

if you need to do the same thing in button action

-(void)selectionButtonAction:(UIButton*)button
{
if (button.tag == 0)
{
    //select all button
    if (isSelectedAll)
    {
        isSelectedAll = NO;
        [arraySelectedRows removeAllObjects];
    }
    else
    {
        [arraySelectedRows removeAllObjects];
        for (int i = 1; i<allDataCount; i++)
        {
            [arraySelectedRows addObject:[NSIndexPath indexPathForRow:i inSection:0]];//section number may be defer for you
        }
        isSelectedAll = YES;
    }
}
else
{
    NSIndexPath *buttonIndexPath = [NSIndexPath indexPathForRow:button.tag inSection:0];//section number may be defer for you
    if([arraySelectedRows containsObject:buttonIndexPath])
    {
        [arraySelectedRows removeObject:buttonIndexPath];

    }
    else
    {
        [arraySelectedRows addObject:buttonIndexPath];
    }
    if ((allDataCount - 1) == arraySelectedRows.count)
    {
        isSelectedAll = YES;
    }
    else
    {
        isSelectedAll = NO;
    }
}
[self.tableView reloadData];
}

The 'arraySelectedRows' contain selected row's indexPath




回答2:


Please try this method

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MessageViewCell *cell =(MessageViewCell *)[tableView dequeueReusableCellWithIdentifier:@"cell"];
    if(cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MessageViewCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    cell.lblUsername.text  = [arrUsername objectAtIndex:indexPath.row];

    NSURL *URL =[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",_URL_IMAGEURL,[arrImages objectAtIndex:indexPath.row]]];

    cell.imgView.tag = indexPath.row;

    UITapGestureRecognizer *tap1 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openProfile:)];

    tap1.numberOfTapsRequired = 1;

    cell.imgView.userInteractionEnabled = YES;

    [cell.imgView addGestureRecognizer:tap1];

    cell.imgView.image = [UIImage imageNamed:@"NoImage.png"];

    [[AsyncImageLoader sharedLoader] cancelLoadingImagesForTarget:cell.imgView];

    cell.imgView.imageURL = URL;

    cell.imgView.layer.cornerRadius = cell.imgView.frame.size.width/2;

    [cell.imgView setClipsToBounds:YES];

    cell.btnCheckBox.tag = indexPath.row;

    [cell.btnCheckBox setHidden:false];

    if([[[arrFriends objectAtIndex:indexPath.row] valueForKey:@"markedToDelete"] boolValue]){
        [cell.btnCheckBox setSelected:TRUE];
    }else{
        [cell.btnCheckBox setSelected:FALSE];
    }


    [cell.btnCheckBox addTarget:self **action:@selector(checkBoxClick:)** forControlEvents:UIControlEventTouchUpInside];

    cell.lblMsg.text = [arrLastMessage objectAtIndex:indexPath.row];

    return cell;
}
/////
-(void)checkBoxClick:(UIButton *)sender
{
    UIButton *btn = (UIButton *)sender;
    NSIndexPath *indexPath = [tblMessages indexPathForCell:(UITableViewCell *)btn.superview.superview];
    [sender setSelected:!sender.isSelected];
    if (sender.isSelected)
    {
        arrFriends[sender.tag][@"markedToDelete"] = @YES;
        if(![arrDeleteUsername containsObject:[arrOppUsername objectAtIndex:indexPath.row]])
        {
            [arrDeleteUsername addObject:[arrOppUsername objectAtIndex:indexPath.row]];
        }
    }
    else
    {
        [arrDeleteUsername removeObject:[arrOppUsername objectAtIndex:indexPath.row]];
        arrFriends[sender.tag][@"markedToDelete"] = @NO;
    }
}



回答3:


Your code for button click action does not look to do any thing. Just add the following code to your project and it should work:

- (void)doneBtn:(UIButton*)sender{
if ([sender tag]==0)
{
    if (selectAll==0)
    {
        selectAll=1;
        [self.arrForIndPaths removeAllObjects];
    }
    else
    {
        selectAll=0;
        [self.arrForIndPaths removeAllObjects];
    }
}
else
{
    if (selectAll!=1)
    {
        if([self.arrForIndPaths containsObject:[NSIndexPath indexPathForRow:[sender tag] inSection:0]])
        {
            [self.arrForIndPaths removeObject:[NSIndexPath indexPathForRow:[sender tag] inSection:0]];
        }
        else
        {
            [self.arrForIndPaths addObject:[NSIndexPath indexPathForRow:[sender tag] inSection:0]];
        }
    }
    else
    {
        selectAll=0;
        if([self.arrForIndPaths containsObject:[NSIndexPath indexPathForRow:[sender tag] inSection:0]])
        {
            [self.arrForIndPaths removeObject:[NSIndexPath indexPathForRow:[sender tag] inSection:0]];
        }
        else
        {
         [self.arrForIndPaths addObject:[NSIndexPath indexPathForRow:[sender tag] inSection:0]];
        }
       }
    }
[tableView reloadData];
}

Or make the changes accordingly.



来源:https://stackoverflow.com/questions/31875235/uitableview-replacing-checkmarks-with-uibutton

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!