问题
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