搜索后{table}按钮选择错误

时间:2017-02-20 08:01:18

标签: ios uitableview uibutton tableviewcell nsindexpath

我在UIButton中有一个UITableViewCell。点击UIButton时,我会在数组中保存点按的按钮标记。因此,当我使用UITableViewUISearchController内搜索时,我获得了所需的输出,但是在错误的单元格中选择了所选按钮。

图1 - 选择按钮并在搜索之前

enter image description here

pic 2 - 搜索之后 enter image description here

在图1中,我选择了属于"房间1"的按钮,但是在搜索之后,如图2所示,输出正确,但按钮不应该&# 39;选择。如何解决这个问题?

----编辑---- 实施

-(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;

}

搜索实施

-(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 个答案:

答案 0 :(得分:0)

由于在这里重复使用tableview单元格,你需要创建一个条件,并检查条件是否为真,然后选择按钮,否则按钮是正常的,所以当下一个单元格要重用时,它将根据数组数据显示正确。检查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
}