UITableview button image disappear while scroll - ios

I am having an UITableview in that in that having three buttons, and the buttons having conditions them working well. My problem is when I select any button image change to the selected image. but when I scroll the table view selected image are changed to normal image. I want to save the selected in the table view. I have seen many stack overflow, but its not helping me. any one help me please.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *CellIdentifier = [NSString stringWithFormat:#"S%1dR%1d",indexPath.section,indexPath.row];
CustomizedCellView *cell = (CustomizedCellView *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell = [table dequeueReusableHeaderFooterViewWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[CustomizedCellView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
button1 = [UIButton buttonWithType:UIButtonTypeCustom];
button1.frame = CGRectMake(80, 27, 36, 36);
[button1 setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:#"l"ofType:#"png"]] forState:UIControlStateNormal];
[button1 setImage:[UIImage imageNamed:#"lblue.png"]
forState:UIControlStateSelected];
[button1 addTarget:self action:#selector(radiobtn4:) forControlEvents:UIControlEventTouchUpInside];
button1.tag=1;
[cell.contentView addSubview:button1];
button2 = [UIButton buttonWithType:UIButtonTypeCustom];
button2.frame = CGRectMake(160, 27, 36, 36);
[button2 setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:#"e"ofType:#"png"]] forState:UIControlStateNormal];
[button2 setImage:[UIImage imageNamed:#"eblue.png"]
forState:UIControlStateSelected];
[button2 addTarget:self action:#selector(radiobtn4:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:button2];
button2.tag=3;
button3 = [UIButton buttonWithType:UIButtonTypeCustom];
button3.frame = CGRectMake(240, 27, 36, 36);
[button3 setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:#"v"ofType:#"png"]] forState:UIControlStateNormal];
[button3 setImage:[UIImage imageNamed:#"vblue.png"]
forState:UIControlStateSelected];
[button3 addTarget:self action:#selector(radiobtn4:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:button3];
button3.tag=2;
- (void)radiobtn4:(UIButton *)sender
{
UITableViewCell *cell=(UITableViewCell *)sender.superview;
if(sender.selected == NO)
{
if(sender.tag==1){
UIButton *otherButton=(UIButton *)[cell viewWithTag:1];
otherButton.selected=YES;
UIButton *other=(UIButton *)[cell viewWithTag:2];
other.selected=NO;
}else if(sender.tag==2){
UIButton *otherButton=(UIButton *)[cell viewWithTag:2];
otherButton.selected=YES;
UIButton *other=(UIButton *)[cell viewWithTag:1];
other.selected=NO;
} else if(sender.tag == 3)
{
UIButton *otherButton=(UIButton *)[cell viewWithTag:3];
otherButton.selected=YES;
}
} else if(sender.selected == YES)
{
if(sender.tag==1){
UIButton *otherButton=(UIButton *)[cell viewWithTag:1];
[otherButton setImage:[UIImage imageNamed:#"l.png"]
forState:UIControlStateNormal];
otherButton.selected=NO;
}else if(sender.tag==2){
UIButton *otherButton=(UIButton *)[cell viewWithTag:2];
[otherButton setImage:[UIImage imageNamed:#"v.png"]
forState:UIControlStateNormal];
otherButton.selected=NO;
} else if(sender.tag == 3)
{
UIButton *otherButton=(UIButton *)[cell viewWithTag:3];
[otherButton setImage:[UIImage imageNamed:#"e.png"]
forState:UIControlStateNormal];
otherButton.selected=NO;
}
}
}
above is my coding, i want to use any array to store the selected image,how can i do that process, please help me in coding.

Related

viewWithTag UIButton not working on tableview reloadData

I'm building a survey app with a table view displaying the questions in rows. Some rows have text fields, some have sliders and some have 5 buttons for the user to select their answers.
I can set the initial UIButton values just fine, with multiple cells of buttons and each button can have their titles set. But when I change the data model and reload the tableview, the first row (0) works but the second row (1) does not. The button1.tag returns 0 for the second row.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cell forIndexPath:indexPath];
NSString *subCatKey = [NSString stringWithFormat:#"%ld", indexPath.row];
NSDictionary *thisSubCat = [_subCatListDict objectForKey:subCatKey];
NSString *defaultResponse = #"";
static NSString *CellIdentifier;
CellIdentifier = #"buttonCell";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
UIButton *button1 = [[UIButton alloc] init];
UIButton *button2 = [[UIButton alloc] init];
UIButton *button3 = [[UIButton alloc] init];
UIButton *button4 = [[UIButton alloc] init];
UIButton *button5 = [[UIButton alloc] init];
NSLog(#"Button 1::%ld",(long)button1.tag);
// - 4 = Button range
NSLog(#"Setting up the button cell");
NSArray *buttonResponses = [[NSArray alloc] initWithArray:[thisSubCat objectForKey:#"responses"]];
[buttonResponses objectAtIndex:0];
if(cell == nil )
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
NSLog(#"Button tag 1::%ld",(long)button1.tag);
if (button1.tag == 0) {
NSLog(#"Setting buttons...");
button1 = (UIButton *)[cell viewWithTag:41];
NSLog(#"Button tag 1::%ld",(long)button1.tag);
button2 = (UIButton *)[cell viewWithTag:42];
button3 = (UIButton *)[cell viewWithTag:43];
button4 = (UIButton *)[cell viewWithTag:44];
button5 = (UIButton *)[cell viewWithTag:45];
[button1 setTitle:[buttonResponses objectAtIndex:0] forState:UIControlStateNormal];
[button2 setTitle:[buttonResponses objectAtIndex:1] forState:UIControlStateNormal];
[button3 setTitle:[buttonResponses objectAtIndex:2] forState:UIControlStateNormal];
[button4 setTitle:[buttonResponses objectAtIndex:3] forState:UIControlStateNormal];
[button5 setTitle:[buttonResponses objectAtIndex:4] forState:UIControlStateNormal];
[button1 addTarget:self
action:#selector(rowButtonSelect:)
forControlEvents:UIControlEventTouchUpInside];
[button2 addTarget:self
action:#selector(rowButtonSelect:)
forControlEvents:UIControlEventTouchUpInside];
[button3 addTarget:self
action:#selector(rowButtonSelect:)
forControlEvents:UIControlEventTouchUpInside];
[button4 addTarget:self
action:#selector(rowButtonSelect:)
forControlEvents:UIControlEventTouchUpInside];
[button5 addTarget:self
action:#selector(rowButtonSelect:)
forControlEvents:UIControlEventTouchUpInside];
}
UILabel *questionLabel = (UILabel *)[cell viewWithTag:301];
questionLabel.text = [thisSubCat objectForKey:#"question"];
UILabel *questionResponses = (UILabel *)[cell viewWithTag:302];
questionResponses.text = defaultResponse;
NSLog(#"Default response:%#",defaultResponse);
return cell;
}
You always Create new Button in cell so it's default tag = 0 so
NSLog(#"Button tag 1::%ld",(long)button1.tag);
will print Button tag 1::0
set
button1.tag indexpath.raw;
and try

Radio buttons get unselected while scrolling UITableView

I have two radio buttons on UITableView Cell.I am able to select one of them while scrolling UITableView down but when I scroll tableview up all radio buttons get unselected. After scrolling also I want to keep them selected but I am not able to do that....So please anyone having solution help me. Thank you
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = #"cell";
customCell *cell = (customCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:#"customCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
leftBtnclick = [UIButton buttonWithType:UIButtonTypeCustom];
leftBtnclick.tag=999;
[leftBtnclick setImage:[UIImage imageNamed:#"unchecked.png"] forState:UIControlStateNormal];
[leftBtnclick setImage:[UIImage imageNamed:#"checked.png"] forState:UIControlStateSelected];
if (screenHeight == 667)
{
[leftBtnclick setFrame:CGRectMake(50, 59, 30, 30)];
}
else if(screenHeight == 480)
{
[leftBtnclick setFrame:CGRectMake(50, 40, 30, 30)];
}
[leftBtnclick addTarget:self action:#selector(leftTickBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
[cell.leftOptBtn addTarget:self action:#selector(leftTickBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:leftBtnclick];
rightBtnclick = [UIButton buttonWithType:UIButtonTypeCustom];
rightBtnclick.tag=1000;
[rightBtnclick setImage:[UIImage imageNamed:#"unchecked.png"] forState:UIControlStateNormal];
[rightBtnclick setImage:[UIImage imageNamed:#"checked.png"] forState:UIControlStateSelected];
if (screenHeight == 667)
{
[rightBtnclick setFrame:CGRectMake(180, 59, 30, 30)];
}
else if(screenHeight == 480)
{
[leftBtnclick setFrame:CGRectMake(50, 40, 30, 30)];
}
[rightBtnclick setFrame:CGRectMake(180, 59, 30, 30)];
[rightBtnclick addTarget:self action:#selector(rightTickBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
[cell.rightOptBtn addTarget:self action:#selector(rightTickBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:rightBtnclick];
cell.numberLbl.text = [numberArray objectAtIndex:indexPath.row];
cell.questionLbl.text = [questionArray objectAtIndex:indexPath.row];
[cell.leftOptBtn setTitle:[leftOptionArray objectAtIndex:indexPath.row] forState:UIControlStateNormal];
[cell.rightOptBtn setTitle:[rightOptionArray objectAtIndex:indexPath.row] forState:UIControlStateNormal];
return cell;
}
-(void)leftTickBtnClicked:(id)sender
{
UIButton *leftTickBtn=(UIButton *)sender;
leftTickBtn.selected=!leftTickBtn.selected;
for(UIView *vw in [[sender superview]subviews])
{
if([vw isKindOfClass:[UIButton class]] && vw.tag==1000)
{
UIButton *rightTickBtn=(UIButton *)vw;
if(leftTickBtn.selected)
{
rightTickBtn.selected=NO;
}
else
{
rightTickBtn.selected=YES;
}
}
}
}
-(void)rightTickBtnClicked:(id)sender
{
UIButton *rightTickBtn=(UIButton *)sender;
rightTickBtn.selected=!rightTickBtn.selected;
for(UIView *vw in [[sender superview]subviews])
{
if([vw isKindOfClass:[UIButton class]] && vw.tag==999)
{
UIButton *leftTickBtn=(UIButton *)vw;
if(rightTickBtn.selected)
{
leftTickBtn.selected=NO;
}
else
{
leftTickBtn.selected=YES;
}
}
}
}
You have created only one leftTickBtn and rightTickBtn and updated it each time when row is created. So finally whatever you have done with radio button, its affected to only last button.
Update your code as below :
UIButton *leftBtnclick = [UIButton buttonWithType:UIButtonTypeCustom];
leftBtnclick.tag=999+indexPath.row;
UIButton *rightBtnclick = [UIButton buttonWithType:UIButtonTypeCustom];
rightBtnclick.tag=1000+indexPath.row;
And implement methods like :
- (IBAction)leftTickBtnClicked:(UIButton *)sender
{
sender.selected = TRUE;
UITableViewCell *cell = [tblAppointment cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1000-sender.tag inSection:0]];
for (id view in cell.contentView.subviews)
{
if ([view isKindOfClass:[UIButton class]])
{
// your code
UIButton *btnRight = (UIButton *)view;
if (sender.selected == TRUE)
btnRight.selected = FALSE;
else
btnRight.selected = TRUE;
}
}
}
And
- (IBAction)rightTickBtnClicked:(UIButton *)sender
{
sender.selected = TRUE;
UITableViewCell *cell = [tblAppointment cellForRowAtIndexPath:[NSIndexPath indexPathForRow:999-sender.tag inSection:0]];
for (id view in cell.contentView.subviews)
{
if ([view isKindOfClass:[UIButton class]])
{
// your code
UIButton *btnLeft = (UIButton *)view;
if (sender.selected == TRUE)
btnLeft.selected = FALSE;
else
btnLeft.selected = TRUE;
}
}
}
You have this issue because of how the reusable cell works.
When you scroll away from the cell you made changes on the radio button , and then try to scroll back to that specific row ,a reusable cell dequeueReusableCellWithIdentifier does not guarantee that it will dequeue the exact same cell you made the changes and most likely it will dequeue a cell that you have not made any changes
You will need to keep track of the buttons selections in a List outside cellForRowAtIndexPath and reassign the selections to your radio buttons in cellForRowAtIndexPath much like the same idea with assigning the cell text every time with cell.numberLbl.text = [numberArray objectAtIndex:indexPath.row]; by using the indexPath.row in an array
See modification [1] , [2] and [3] on the code below (haven't tested it but you get the idea)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = #"cell";
customCell *cell = (customCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:#"customCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
leftBtnclick = [UIButton buttonWithType:UIButtonTypeCustom];
leftBtnclick.tag=999;
[leftBtnclick setImage:[UIImage imageNamed:#"unchecked.png"] forState:UIControlStateNormal];
[leftBtnclick setImage:[UIImage imageNamed:#"checked.png"] forState:UIControlStateSelected];
if (screenHeight == 667)
{
[leftBtnclick setFrame:CGRectMake(50, 59, 30, 30)];
}
else if(screenHeight == 480)
{
[leftBtnclick setFrame:CGRectMake(50, 40, 30, 30)];
}
[leftBtnclick addTarget:self action:#selector(leftTickBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
[cell.leftOptBtn addTarget:self action:#selector(leftTickBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:leftBtnclick];
rightBtnclick = [UIButton buttonWithType:UIButtonTypeCustom];
rightBtnclick.tag=1000;
[rightBtnclick setImage:[UIImage imageNamed:#"unchecked.png"] forState:UIControlStateNormal];
[rightBtnclick setImage:[UIImage imageNamed:#"checked.png"] forState:UIControlStateSelected];
if (screenHeight == 667)
{
[rightBtnclick setFrame:CGRectMake(180, 59, 30, 30)];
}
else if(screenHeight == 480)
{
[leftBtnclick setFrame:CGRectMake(50, 40, 30, 30)];
}
[rightBtnclick setFrame:CGRectMake(180, 59, 30, 30)];
[rightBtnclick addTarget:self action:#selector(rightTickBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
[cell.rightOptBtn addTarget:self action:#selector(rightTickBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:rightBtnclick];
cell.numberLbl.text = [numberArray objectAtIndex:indexPath.row];
cell.questionLbl.text = [questionArray objectAtIndex:indexPath.row];
[cell.leftOptBtn setTitle:[leftOptionArray objectAtIndex:indexPath.row] forState:UIControlStateNormal];
[cell.rightOptBtn setTitle:[rightOptionArray objectAtIndex:indexPath.row] forState:UIControlStateNormal];
//[1]Set values for left and right
rightTickBtn.selected = [RightTicksArray objectAtIndex:indexPath.row];
leftTickBtn.selected = [LeftTicksArray objectAtIndex:indexPath.row];
return cell;
}
-(void)leftTickBtnClicked:(id)sender
{
UIButton *leftTickBtn=(UIButton *)sender;
leftTickBtn.selected=!leftTickBtn.selected;
for(UIView *vw in [[sender superview]subviews])
{
if([vw isKindOfClass:[UIButton class]] && vw.tag==1000)
{
UIButton *rightTickBtn=(UIButton *)vw;
if(leftTickBtn.selected)
{
rightTickBtn.selected=NO;
}
else
{
rightTickBtn.selected=YES;
}
//[2]Update RightTickArray At Pos
[RightTickArray objectAtIndex:indexPath.row] = leftTickBtn.selected;
}
}
}
-(void)rightTickBtnClicked:(id)sender
{
UIButton *rightTickBtn=(UIButton *)sender;
rightTickBtn.selected=!rightTickBtn.selected;
for(UIView *vw in [[sender superview]subviews])
{
if([vw isKindOfClass:[UIButton class]] && vw.tag==999)
{
UIButton *leftTickBtn=(UIButton *)vw;
if(rightTickBtn.selected)
{
leftTickBtn.selected=NO;
}
else
{
leftTickBtn.selected=YES;
}
//[3]Update LeftTickArray At Pos
[LeftTicksArray objectAtIndex:indexPath.row] = leftTickBtn.selected;
}
}
}
I got solution for my question. UITableView cells are reusable when you scroll tableview cell gets reused that's why radio button selection disappears. So solution is store your selection in one array use that array in cellForRowAtIndexPath. See code.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = #"cell";
customCell *cell = (customCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:#"customCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
leftBtnclick = [UIButton buttonWithType:UIButtonTypeCustom];
leftBtnclick.tag=999;
cell.leftOptBtn.tag=999;
[leftBtnclick setImage:[UIImage imageNamed:#"unchecked.png"] forState:UIControlStateNormal];
[leftBtnclick setImage:[UIImage imageNamed:#"checked.png"] forState:UIControlStateSelected];
[leftBtnclick setFrame:CGRectMake(50, 59, 30, 30)];
[leftBtnclick addTarget:self action:#selector(leftTickBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
[cell.leftOptBtn addTarget:self action:#selector(leftBtnClicked) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:leftBtnclick];
rightBtnclick = [UIButton buttonWithType:UIButtonTypeCustom];
rightBtnclick.tag=1000;
cell.rightTickBtn.tag=1000;
[rightBtnclick setImage:[UIImage imageNamed:#"unchecked.png"] forState:UIControlStateNormal];
[rightBtnclick setImage:[UIImage imageNamed:#"checked.png"] forState:UIControlStateSelected];
[rightBtnclick setFrame:CGRectMake(190, 59, 30, 30)];
[rightBtnclick addTarget:self action:#selector(rightTickBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
[cell.rightOptBtn addTarget:self action:#selector(rightBtnClicked) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:rightBtnclick];
cell.numberLbl.text = [numberArray objectAtIndex:indexPath.row];
cell.questionLbl.text = [questionArray objectAtIndex:indexPath.row];
[cell.leftOptBtn setTitle:[leftOptionArray objectAtIndex:indexPath.row] forState:UIControlStateNormal];
[cell.rightOptBtn setTitle:[rightOptionArray objectAtIndex:indexPath.row] forState:UIControlStateNormal];
if ([[answerArray objectAtIndex:indexPath.row] isEqualToString:#"YES"])
{
leftBtnclick.selected=YES;
rightBtnclick.selected=NO;
}
else if ([[answerArray objectAtIndex:indexPath.row] isEqualToString:#"NO"])
{
leftBtnclick.selected=NO;
rightBtnclick.selected=YES;
}
else
{
leftBtnclick.selected=NO;
rightBtnclick.selected=NO;
}
return cell;
}
-(void)leftTickBtnClicked:(id)sender
{
CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:questionTable];
NSIndexPath *indexPath1 = [questionTable indexPathForRowAtPoint:buttonPosition];
[answerArray replaceObjectAtIndex:indexPath1.row withObject:#"YES"];
UIButton *leftTickBtn=(UIButton *)sender;
leftTickBtn.selected=!leftTickBtn.selected;
for(UIView *vw in [[sender superview]subviews])
{
if([vw isKindOfClass:[UIButton class]] && vw.tag==1000)
{
UIButton *rightTickBtn=(UIButton *)vw;
if(leftTickBtn.selected)
{
rightTickBtn.selected=NO;
}
else
{
rightTickBtn.selected=YES;
}
}
}
NSLog(#"Answer Array: %#",answerArray);
}
-(void)rightTickBtnClicked:(id)sender
{
CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:questionTable];
NSIndexPath *indexPath1 = [questionTable indexPathForRowAtPoint:buttonPosition];
[answerArray replaceObjectAtIndex:indexPath1.row withObject:#"NO"];
UIButton *rightTickBtn=(UIButton *)sender;
rightTickBtn.selected=!rightTickBtn.selected;
for(UIView *vw in [[sender superview]subviews])
{
if([vw isKindOfClass:[UIButton class]] && vw.tag==999)
{
UIButton *leftTickBtn=(UIButton *)vw;
if(rightTickBtn.selected)
{
leftTickBtn.selected=NO;
}
else
{
leftTickBtn.selected=YES;
}
}
}
NSLog(#"Answer Array: %#",answerArray);
}

how to check the condition for UIButtons in UITableview

I am having three button image in table view, I want to check the conditions between them. when I click the button 1 means background image change to blue colour. at the same time I click the button 1 it will move to normal state white colour. Same for another two buttons.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath![button3 condition][3]
{
static NSString *cellIdentifier = #"HistoryCell";
CustomizedCellView *cell = (CustomizedCellView *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[CustomizedCellView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
UIButton *button1;
button1 = [UIButton buttonWithType:UIButtonTypeCustom];
button1.frame = CGRectMake(80, 27, 36, 36);
[button1 setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:#"l"ofType:#"png"]] forState:UIControlStateNormal];
button1.tag = 1;
[button1 addTarget:self action:#selector(radiobtn:) forControlEvents:UIControlEventTouchUpInside];
[button1 setSelected:true];
[cell.contentView addSubview:button1];
UIButton *button2;
button2 = [UIButton buttonWithType:UIButtonTypeCustom];
button2.frame = CGRectMake(160, 27, 36, 36);
[button2 setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:#"e"ofType:#"png"]] forState:UIControlStateNormal];
button2.tag = 1;
[button2 addTarget:self action:#selector(radiobtn:) forControlEvents:UIControlEventTouchUpInside];
[button2 setSelected:true];
[cell.contentView addSubview:button2];
UIButton *button3;
button3 = [UIButton buttonWithType:UIButtonTypeCustom];
button3.frame = CGRectMake(240, 27, 36, 36);
[button3 setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:#"v"ofType:#"png"]] forState:UIControlStateNormal];
button3.tag = 1;
[button3 addTarget:self action:#selector(radiobtn:) forControlEvents:UIControlEventTouchUpInside];
[button3 setSelected:true];
[cell.contentView addSubview:button3];
return cell;
}
My condition is: when button 1 is clicked means button 3 should not change. when button 3 is clicked means button 1 should not change.button 2 can select in both the condition.
- (void)radiobtn:(UIButton *)button
{
if(button.tag == 1)
{
[button setImage:[UIImage imageNamed:#"lblue.png"] forState:UIControlStateSelected];
}
if(button.tag == 2)
{
[button setImage:[UIImage imageNamed:#"eblue.png"] forState:UIControlStateSelected];
}
if(button.tag == 3)
{
[button setImage:[UIImage imageNamed:#"vblue.png"] forState:UIControlStateSelected];
}
}
can any one help me in coding.
First of all you can set different tag for each button's like
button.tag == 1,
button.tag == 2,
button.tag == 3
And then after you can write your radiobtn Action like this way..
-(IBAction) radiobtn:(id)sender
{
UIButton *yourBtn = (UIButton *)[self.view viewWithTag:[sender tag]];
if(yourBtn.tag == 1) {
[yourBtn setImage:[UIImage imageNamed:#"lblue.png"] forState:UIControlStateSelected];
}
else if(yourBtn.tag == 2){
[yourBtn setImage:[UIImage imageNamed:#"eblue.png"] forState:UIControlStateSelected];
}
else{
[yourBtn setImage:[UIImage imageNamed:#"vblue.png"] forState:UIControlStateSelected];
}
}
button1.tag=1; button2.tag=2; button3.tag=3;
-(void)radiobtn:(UIButton *)button
{
if(button.tag==1)
{
if(![button3 isSelected])
{
if([button1 isSelected])
button1.backgroundColor = [UIColor blueColor];
else
button1.backgroundColor = [UIColor whiteColor];
}
else
{
//No change
}
}
else if(button.tag==2)
{
if([button2 isSelected])
button2.backgroundColor = [UIColor blueColor];
else
button2.backgroundColor = [UIColor whiteColor];
}
else if(button.tag==3)
{
if(![button1 isSelected])
{
if([button3 isSelected])
button3.backgroundColor = [UIColor blueColor];
else
button3.backgroundColor = [UIColor whiteColor];
}
else
{
//No change
}
}
}
Can you have a try on this..
Please check!! i have done same thing on my code.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = #"UITableViewCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
}
UIView * selectedBackgroundView = [[UIView alloc] initWithFrame:cell.frame];
[selectedBackgroundView setBackgroundColor:[UIColor redColor]]; // set color here
[cell setSelectedBackgroundView:selectedBackgroundView];
self.tableview.separatorColor = [UIColor whiteColor];
if (_userResult.relationStatus == [arrAnswrs objectAtIndex:indexPath.row]){
cell.accessoryType=UITableViewCellAccessoryCheckmark;
}else if (_userResult.childrenStatus == [arrAnswrs objectAtIndex:indexPath.row]){
cell.accessoryType=UITableViewCellAccessoryCheckmark;
}
else{
cell.accessoryType=UITableViewCellAccessoryNone;
}
[[UITableViewCell appearance] setTintColor:[UIColor redColor]];
cell.textLabel.text = [arrAnswrs objectAtIndex:indexPath.row];
cell.textLabel.font = [UIFont fontWithName:#"Roboto" size:16];
cell.textLabel.textColor = UIColorFromRGB(0xe212121);
cell.backgroundColor = UIColorFromRGB(0xeaaea7);
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(#"Select indexPath.section %d --- index %d", (int)indexPath.section, (int)indexPath.row);
[tableView deselectRowAtIndexPath:indexPath animated:YES];
NSString *status = [arrAnswrs objectAtIndex:indexPath.row];
UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor redColor];
[cell setSelectedBackgroundView:bgColorView];
int iSeletedButton = (int)selectButton.tag ;
NSLog(#"value %# -- iSeletedButton %d", [arrAnswrs objectAtIndex:indexPath.row], iSeletedButton);
switch (iSeletedButton) {
case 1:
_userResult.relationStatus = status;
_labelFrstStatus.text = status;
_labelFrstStatus.textColor = [UIColor blackColor];
break;
case 2:
_userResult.childrenStatus = status;
_labelSecndStatus.text = status;
_labelSecndStatus.textColor = [UIColor blackColor];
break;
default:
break;
}
if (_userResult.relationStatus || _userResult.childrenStatus) {
cell.accessoryType = UITableViewCellAccessoryNone;
}
else cell.accessoryType = UITableViewCellAccessoryCheckmark;
[tableView reloadData];
}
U can set tags to button
button1.tag=1;
button2.tag=2;
button3.tag=3; //instead of tag 1 for all buttons
Take reference for buttons as button1,button2,button3 globally..
NSLog(#"%#",[[sender superview] class]); //UITableViewCellContentView
NSLog(#"%#",[[[sender superview] superview] class]); //UITableViewCellScrollView
NSLog(#"%#",[[[[sender superview]superview]superview] class]); //UITableViewCell
- (void)radiobtn:(UIButton *)button
{
if(button.tag==1)
{
//handle
CustomizedCellView * cell = (CustomizedCellView*)[[[button superview]superview]superview];
if ([button.imageView.image isEqual:[UIImage imageNamed:#"lblue.png"]]) {
[button setImage:[UIImage imageNamed:#"lwhite.png"] forState:UIControlStateSelected];
}
for (UIButton *btn in cell.contentView.subviews) {
if (btn.tag==3) {
[btn setImage:[UIImage imageNamed:#"vwhite.png"] forState:UIControlStateSelected];
}
}
}
else if(button.tag==2)
{
//handle
if ([button.imageView.image isEqual:[UIImage imageNamed:#"eblue.png"]]) {
[button setImage:[UIImage imageNamed:#"ewhite.png"] forState:UIControlStateSelected];
}
}
else if(button.tag==3)
{
//handle
CustomizedCellView * cell = (CustomizedCellView*)[[[sender superview]superview]superview];
if ([button.imageView.image isEqual:[UIImage imageNamed:#"vblue.png"]]) {
[button setImage:[UIImage imageNamed:#"vwhite.png"] forState:UIControlStateSelected];
}
for (UIButton *btn in cell.contentView.subviews) {
if (btn.tag==2) {
[btn setImage:[UIImage imageNamed:#"lwhite.png"] forState:UIControlStateSelected];
}
}
}
}
Hope it helps you...!

Checkboxes icons are not shown properly

i am making an app in which i am using tableview cell and in uitableview cell i am using button in the form of checkbox. i have two images named "uncheck.png" and "tick.png" when i click on that button tick is shown but uncheck image is disappear i want that tick image on that uncheck image...!
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *tableviewidentifier = #"cell";
tablecellTableViewCell *cell= [self.activitiesTableView_ dequeueReusableCellWithIdentifier:tableviewidentifier];
if(cell==nil)
{
cell = [[tablecellTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:tableviewidentifier];
}
UILabel *valuedate = (UILabel *)[cell viewWithTag:11];
UILabel *msg = (UILabel *)[cell viewWithTag:12];
UILabel *date = (UILabel *)[cell viewWithTag:13];
UILabel *time = (UILabel *)[cell viewWithTag:14];
[valuedate setText:#"Demo"];
[msg setText:#"How are You?"];
date.text=#"14/07/2014";
time.text=#"A 08:16";
// [cell.textLabel setText:activityModel.userName];
valuedate.font=[UIFont fontWithName:#"SegoeUI" size:15];
msg.font=[UIFont fontWithName:#"SegoeUI-light" size:10.0];
date.font=[UIFont fontWithName:#"SegoeUI-light" size:9];
time.font=[UIFont fontWithName:#"SegoeUI-light" size:9];
if ([self.checkimageArray containsObject:[self.lblArray objectAtIndex:indexPath.row]])
{
[cell.button setImage:[UIImage imageNamed:#"tick.png"] forState:UIControlStateNormal];
//[cell.button setImage:[UIImage imageNamed:#"uncheck.png"] forState:UIControlStateNormal];
}
else
{
[cell.button setImage:[UIImage imageNamed:#"uncheck.png"] forState:UIControlStateNormal];
}
cell.button.tag=indexPath.row;
[cell.button addTarget:self action:#selector(checkButton:) forControlEvents:UIControlEventTouchUpInside];
return cell;
}
Use your uncheck image as background image using
[cell.button setBackgroundImage:[UIImage imageNamed:#"uncheck.png"] forState:UIControlStateNormal];
and then your check image as image
[cell.button setImage:[UIImage imageNamed:#"tick.png"] forState:UIControlStateNormal];
Now you can change the image of button at each tap but the background image will be fixed. when the button is selected set the tick image as image else set it as nil
Replace your code with this
[cell.button setBackgroundImage:[UIImage imageNamed:#"uncheck.png"] forState:UIControlStateNormal];
[cell.button setImage:nil forState:UIControlStateNormal];
if ([self.checkimageArray containsObject:[self.lblArray objectAtIndex:indexPath.row]])
{
[cell.button setImage:[UIImage imageNamed:#"tick.png"] forState:UIControlStateNormal];
}
May be this can solve your problem

How to disable UIButton in tableview after called another UIVIew in ios

I have 1 UITableView has multiple UIButton (named is "Open"button with different tags) in each row, i set tag for them. Now, after click on any button in each row, it'll show a UIView (detailView). On detailView has 1 "Submit"button. I want to when user click on "Submit" button, "Open"button with tag selected is disable. How can i do that? I used this code :
Code to create tableview with mutiple "Open"button:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *CellIdentifier = [NSString stringWithFormat:#"%d,%d",indexPath.section,indexPath.row];
UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
UIButton *market = [UIButton buttonWithType:UIButtonTypeCustom];
[market addTarget:self action:#selector(marketPressedAction:) forControlEvents:UIControlEventTouchDown];
[market setTag:3000];
[market setFrame:CGRectMake(200, 6, 30, 30)];
[cell.contentView addSubview:market];
}
marketButton = (UIButton *)[cell.contentView viewWithTag:3000];
[marketButton setTag:indexPath.row];
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
_tableView.contentInset = UIEdgeInsetsMake(0, 0, 100, 0);
return cell;
}
And code when click on"Open"button:
- (void)marketPressedAction:(id)sender
{
UIButton *button = (UIButton *)sender;
buttontag = button.tag;
NSLog(#"Market button click at row %d",buttontag);
if ([sender isSelected]) {
[sender setImage:[UIImage imageNamed:#"Marketplace.png"] forState:UIControlStateHighlighted];
[sender setSelected:NO];
}
else {
[sender setImage:[UIImage imageNamed:#"MarketplaceSelect.png"] forState:UIControlStateSelected];
[sender setSelected:YES];
}
}
}
If you want your "Open" button to be disabled after you click submit button, you should use delegates
UIButton *btn = (UIButton *)sender;
btn.enabled = NO;
Try this one in button click method
EDITED :
Change you marketPressedAction parameter id to UIButton * and write code of below
-(void)marketPressedAction:(UIButton *)sender
{
[sender setImage:[UIImage imageNamed:#"Marketplace.png"] forState:UIControlStateHighlighted];
[sender setImage:[UIImage imageNamed:#"MarketplaceSelect.png"] forState:UIControlStateSelected];
/// Here set you image ////////////////
[sender setImage:[UIImage imageNamed:#"myCustome.png"] forState:UIControlStateNormal];
[self createMarketPlaceForm]; // call detailView
sender.enabled = NO;
sender.userInteractionEnabled = NO;
}

Resources