搜索后Tableview按钮选择错误

Posted

技术标签:

【中文标题】搜索后Tableview按钮选择错误【英文标题】:Tableview button selection wrong after search 【发布时间】:2017-02-20 08:01:18 【问题描述】:

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

图 1 - 选择按钮和搜索之前

pic 2 - 搜索后

在图 1 中,我选择了属于“房间 1”的按钮,但搜索后,如图 2 所示,输出正确,但不应选择按钮。如何解决这个问题?

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

-(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】:

由于此处重用了 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

【讨论】:

以上是关于搜索后Tableview按钮选择错误的主要内容,如果未能解决你的问题,请参考以下文章

协助区分 URL 和 Tableview 数据

在 tableview 的文本字段中搜索

在单元格中单击时,tableView:indexPathForCell 返回 nil

tableview.reloaddata() 在使用 coredata 时搜索栏取消按钮后不起作用

iPhone:TableView 下的图像视图和按钮

搜索栏返回按钮