Tableview button selection wrong after search

断了今生、忘了曾经 提交于 2019-12-25 05:47:05

问题


I have a UIButton in the UITableViewCell. When a UIButton is tapped, I'm saving the tapped button tag in the array. So when I search within the UITableView using the UISearchController, I'm getting the desired output, but the selected button is selected within the wrong cell.

Pic 1 - Button selected and before search

pic 2 - After the search

In the pic 1, I have selected the button that belongs to "room 1", but after the search, as you can see in the pic 2, the output is correct, but the buttons shouldn't be selected. How to solve this issue?

---- Edited---- Implementation

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
  return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  if (shouldShowSearchresult) {
    return searchArray.count;
  }
  else
  {
    return roomNameArray.count;
  }

}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *cellIdentifier = @"roomCells";
  cell = (roomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
  if (shouldShowSearchresult) {
    cell.roomName.text = [searchArray objectAtIndex:indexPath.row];
    // cell.seatingCapacity.text = [NSString stringWithFormat:@"Seats %@ people",[seatingCapacityArray objectAtIndex:indexPath.row]];
    cell.approval.text = @"Approval not required";
  }
  else
  {
    cell.roomName.text = [roomNameArray objectAtIndex:indexPath.row];
    // cell.seatingCapacity.text = [NSString stringWithFormat:@"Seats %@ people",[seatingCapacityArray objectAtIndex:indexPath.row]];
    cell.approval.text = @"Approval not required";

  }

    for (UIButton *slotButton in cell.timeslotScrollView.subviews) {
      [slotButton removeFromSuperview];
    }
    UIButton *slotButton;
  cell.timeslotScrollView.contentSize = CGSizeMake(500, 0);
  cell.timeslotScrollView.scrollEnabled = YES;
  cell.timeslotScrollView.showsHorizontalScrollIndicator = NO;
  int buttonSpace = 10;
  int buttonWidth = 68;
  int buttonHeight = 35;
  int yPosition = 0;
  float xPosition = 0;



    for (int i=0; i<timeSlotArray.count; i++) {
      slotButton = [[UIButton alloc]init];
      slotButton.frame = CGRectMake(xPosition, yPosition, buttonWidth, buttonHeight);
      [slotButton setTitle:[NSString stringWithFormat:@"%@", timeSlotArray[i]] forState:UIControlStateNormal];
      [slotButton setTitleColor:[UIColor colorWithRed:0.23 green:0.71 blue:0.29 alpha:1.0] forState:UIControlStateNormal] ;
      slotButton.layer.borderWidth = 2;
      slotButton.layer.borderColor = [UIColor colorWithRed:0.23 green:0.71 blue:0.29 alpha:1.0].CGColor;
      slotButton.layer.cornerRadius = 3;
      slotButton.tag = i;



      slotButton.userInteractionEnabled = YES;
      [slotButton addTarget:self action:@selector(didTap:) forControlEvents:UIControlEventTouchUpInside];
      xPosition = slotButton.frame.origin.x+buttonWidth+buttonSpace;



      if (cell.timeslotScrollView.subviews.count < timeSlotArray.count)
      {
        [cell.timeslotScrollView addSubview:slotButton];
      }

    }

  NSArray *tempArray = cell.timeslotScrollView.subviews;
  NSLog(@"%ld",tempArray.count);

  return cell;
}

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cello forRowAtIndexPath:(NSIndexPath *)indexPath{


  if (indexPath.row==tappedButtonRowIndex)
  {

    for (int i = 0; i <cell.timeslotScrollView.subviews.count; i++)
    {
      UIView *view = [cell.timeslotScrollView.subviews objectAtIndex:i];
      if ([view isKindOfClass:[UIButton class]])
      {
        UIButton *slotTempBtn = (UIButton *)view;
        BOOL btnFound = false;
        for (NSString *index in buttonSelectedArray)
        {
          if ([index integerValue]== slotTempBtn.tag)
          {
            btnFound = true;
            break;
          }
        }
        if (btnFound) {
          [slotTempBtn setBackgroundColor:[UIColor greenColor]];
        }
        else
        {
          [slotTempBtn setBackgroundColor:[UIColor whiteColor]];
        }
      }

    }
  }
  else
  {
    for (UIView *view in cell.timeslotScrollView.subviews)
    {
      if ([view isKindOfClass:[UIButton class]])
      {
        UIButton *slotTempBtn = (UIButton *)view;
        [slotTempBtn setBackgroundColor:[UIColor whiteColor]];
      }
    }
  }




  cell.slotButtonDelegate=self;

}

Search Implementation

-(void)updateSearchResultsForSearchController:(UISearchController *)searchController
{
  [self updateFilteredContentWithSearchText:searchController.searchBar.text];

  [_roomTableView reloadData];
}

- (void)updateFilteredContentWithSearchText:(NSString*)searchText
{
  [searchArray removeAllObjects];
  for (NSString *room in roomNameArray)
  {
    NSRange nameRange = [room rangeOfString:searchText options:NSCaseInsensitiveSearch];
    if (nameRange.location != NSNotFound)
    {
      [searchArray addObject:room];
    }
  }
  self.roomTableView.tableFooterView = [[UIView alloc]initWithFrame:CGRectZero];
}

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
  if (searchBar.text.length >= 1) {
    shouldShowSearchresult = true;
     }
  else
  {
    shouldShowSearchresult = false;
  }
  [_roomTableView reloadData];

}

-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
  shouldShowSearchresult = false;
  [_roomTableView reloadData];
}

回答1:


As the tableview cell is reused here you need to make one condition and check there if condition is true then button is selected otherwise button is normal so when next time cell is going to reuse it will display proper as per array data. check in the condition in your tableView cellForRow method

if yourArray.count > 0 {
    //check your array and set cell's button selection as per id or tag
}
else { 
   //set all cells all the button unselected
}


来源:https://stackoverflow.com/questions/42339265/tableview-button-selection-wrong-after-search

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