UITableViewCell UIButton Selection [duplicate]

2019-09-15 17:48发布

This question is an exact duplicate of:

It would be great if someone can help to achieve the below requirement. In the tableviewcell, i have horizontal scrollview which will have uibuttons added dynamically. User can select multiple buttons from one row, but cannot select button from different rows. For e.g., If I have already selected buttons(i should be able to select one or more buttons) in row1, and when i tap button in row2, selected buttons in row1 should be deselected and the button which i tapped in row2 should be selected.

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

  cell.timeslotScrollView.contentSize = CGSizeMake(500, 0);
  cell.timeslotScrollView.scrollEnabled = YES;
  cell.timeslotScrollView.showsHorizontalScrollIndicator = NO;

  UIButton *button = [[UIButton alloc]init];
  button.frame = CGRectMake(0, 0, 68, 35);
  [button setTitle:@"abc" forState:UIControlStateNormal];

  button.layer.borderWidth = 2;
  button.layer.borderColor = [UIColor colorWithRed:0.23 green:0.71 blue:0.29 alpha:1.0].CGColor;
  button.layer.cornerRadius = 3;
  button.userInteractionEnabled = YES;
   [button setTitleColor:[UIColor colorWithRed:0.23 green:0.71 blue:0.29 alpha:1.0] forState:UIControlStateNormal];
  [button setTag:indexPath.row];
  [button addTarget:self action:@selector(didTap:) forControlEvents:UIControlEventTouchUpInside];

  UIButton *button1 = [[UIButton alloc]init];
  button1.frame = CGRectMake(button.frame.origin.x+68+buttonSpace, 0, 68, 35);
  [button1 setTitle:@"5 pm"  forState:UIControlStateNormal];
  [button1 setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
  button1.layer.borderWidth = 2;
  button1.layer.borderColor = [UIColor grayColor].CGColor;
  button1.layer.cornerRadius = 3;
  button1.userInteractionEnabled = YES;
  [button1 setTag:indexPath.row];


  [button1 addTarget:self action:@selector(didTap:) forControlEvents:UIControlEventTouchUpInside];

  [cell.timeslotScrollView addSubview:button];
  [cell.timeslotScrollView addSubview:button1];

  }

  return cell;
}

-(void)didTap:(id)sender
{
  UIButton *pressedButton = (UIButton *)sender;
  if (pressedButton.tag != selectedButton ) {
    [sender setBackgroundColor:[UIColor greenColor]];

    selectedButton = pressedButton.tag;


  }
  else{
    [sender setBackgroundColor:[UIColor clearColor]];

  }
}

2条回答
叼着烟拽天下
2楼-- · 2019-09-15 18:33

I would try a different approach. I would subclass UITableViewCell and add the button inside the cell implementation file. Then I would add a method in this cell that trigger the selection/deseletion of the buttons and any other action you need to perform.

At this point, in the cellForRowAtIndexPath delegate your only concern will be to call the method in the cell to perform the selection deselection.

查看更多
ら.Afraid
3楼-- · 2019-09-15 18:45

I would do something like this:

- (void) tableView: (UITableView *) tableView didDeselectRowAtIndexPath: (NSIndexPath *)indexPath {
     [[tableView cellForRowAtIndexPath: indexPath] deselectAllButtons];
}

Now everytime a row gets unselected, all its buttons will be deselected, no matter what happens on any of the other rows. You will still have to write your own deselectAllButtons method, e.g. by iterating over all the subviews of timeslotScrollView.

查看更多
登录 后发表回答