Dridia
Dridia

Reputation: 183

Selecting a cell shows a button and deselecting hides the button

I want a button to show when i select a cell, when i select the same cell or another cell i want the button to hide. So one button should only be visible at a time.

What i have:

in my .h file:

@property (strong, nonatomic) NSIndexPath *isselectednow;

and my .m file:

Viewdidload:

self.isselectednow = [NSIndexPath indexPathForRow:7 inSection:1];

cellForRowAtIndexPath:

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


static NSString *CellIdentifier = @"Cell";

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


 //[cell addSubview:[self drawSeparationView:(indexPath.row)]];

 UILabel *DateName = (UILabel *)[cell viewWithTag:100100];
 DateName.textColor = [UIColor blackColor];
 //DateName.text = [NSString stringWithFormat:@"%ld",(long)indexPath.row ];
 DateName.text = objects[indexPath.row];

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self
           action:@selector(buttonOnCellPressed:)
 forControlEvents:UIControlEventTouchDown];
[button setTitle:@"Update" forState:UIControlStateNormal];
button.frame = CGRectMake(DEVICE_SIZE.width - 60, 18, 55, 15);

[cell addSubview:button];
if ([indexPath compare:self.isselectednow] == NSOrderedSame) {
    button.hidden = NO;
}
else{
    button.hidden = YES;
}

 UILabel *lbl1 = (UILabel *)[cell viewWithTag:100101];
 lbl1.textColor = UIColorFromRGB(0x141414);
 UILabel *lbl2 = (UILabel *)[cell viewWithTag:100102];
 lbl2.textColor = UIColorFromRGB(0x141414);
 UILabel *lbl3 = (UILabel *)[cell viewWithTag:100103];
 lbl3.textColor = UIColorFromRGB(0x141414);
 UILabel *lbl4 = (UILabel *)[cell viewWithTag:100104];
 lbl4.textColor = UIColorFromRGB(0x141414);
 UILabel *lbl5 = (UILabel *)[cell viewWithTag:100105];
 lbl5.textColor = UIColorFromRGB(0x141414);

 UITextField *breakfastName = (UITextField *) [cell viewWithTag:100200];
 breakfastName.attributedPlaceholder =
 [[NSAttributedString alloc]
  initWithString:@"Name here"
  attributes:@{NSForegroundColorAttributeName:UIColorFromRGB(0x141414)}];
 breakfastName.textColor = UIColorFromRGB(0x141414);
 [breakfastName setDelegate:self];
 //[breakfastName addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];

 UITextField *OutName = (UITextField *) [cell viewWithTag:100201];
 OutName.attributedPlaceholder =
 [[NSAttributedString alloc]
  initWithString:@"Name here"
  attributes:@{NSForegroundColorAttributeName:UIColorFromRGB(0x141414)}];
 OutName.textColor = UIColorFromRGB(0x141414);
 [OutName setDelegate:self];

 UITextField *lunchName = (UITextField *) [cell viewWithTag:100202];
 lunchName.attributedPlaceholder =
 [[NSAttributedString alloc]
  initWithString:@"Name here"
  attributes:@{NSForegroundColorAttributeName:UIColorFromRGB(0x141414)}];
 lunchName.textColor = UIColorFromRGB(0x141414);
 [lunchName setDelegate:self];

 UITextField *InName = (UITextField *) [cell viewWithTag:100203];
 InName.attributedPlaceholder =
 [[NSAttributedString alloc]
  initWithString:@"Name here"
  attributes:@{NSForegroundColorAttributeName:UIColorFromRGB(0x141414)}];
 InName.textColor = UIColorFromRGB(0x141414);
 [InName setDelegate:self];

 UITextField *eveningName = (UITextField *) [cell viewWithTag:100204];
 eveningName.attributedPlaceholder =
 [[NSAttributedString alloc]
  initWithString:@"Name here"
  attributes:@{NSForegroundColorAttributeName:UIColorFromRGB(0x141414)}];
 eveningName.textColor = UIColorFromRGB(0x141414);
 [eveningName setDelegate:self];

 UITextField *othersName = (UITextField *) [cell viewWithTag:100205];
 othersName.attributedPlaceholder =
 [[NSAttributedString alloc]
 initWithString:@"Name here"
 attributes:@{NSForegroundColorAttributeName:UIColorFromRGB(0x141414)}];
 othersName.textColor = UIColorFromRGB(0x141414);



 cell.clipsToBounds = YES;
 cell.accessoryType = UITableViewCellAccessoryNone;
 cell.backgroundColor = UIColorFromRGB(0xf3f0e9);

return cell; }

didSelectRowAtIndexPath:

[tableView beginUpdates];
if ([indexPath compare:self.isselectednow] == NSOrderedSame) {
    self.isselectednow = nil;
}
else{
    self.isselectednow = indexPath;
}

[tableView endUpdates];
//[tableView reloadData];

enter image description here

Upvotes: 0

Views: 426

Answers (1)

Lyndsey Scott
Lyndsey Scott

Reputation: 37290

From the docs about beginUpdates:

Call this method if you want subsequent insertions, deletion, and selection operations (for example, cellForRowAtIndexPath: and indexPathsForVisibleRows) to be animated simultaneously.

Although you've changed the isSelectedNow boolean, you haven't actually specified any insertion, deletion, or selection operations between beginUpdates and endUpdates. So you're not actually beginning or ending any updates to the cells' content with that code.

I'm not sure what you're trying to do, but taking out [tableView beginUpdates]; and [tableView beginUpdates]; and reinserting [tableView reloadData]; would result in a proper data reload.

Edit:

Aside from that, the problem is that you're reusing your cells with dequeueReusableCellWithIdentifier:, but you're adding a new UIButton subview each time, so you're basically putting each new UIButton over the old. I suggest doing what you've done for all your labels and textfields in cellForRowAtIndexPath: -- reuse your update button by adding it to your custom table view cell and accessing it with viewWithTag:.

Upvotes: 1

Related Questions