搜索后Tableview按钮选择错误
Posted
技术标签:
【中文标题】搜索后Tableview按钮选择错误【英文标题】:Tableview button selection wrong after search 【发布时间】:2017-02-20 08:01:18 【问题描述】:我在UITableViewCell
中有一个UIButton
。当UIButton
被点击时,我将点击的按钮标签保存在数组中。因此,当我使用UISearchController
在UITableView
中搜索时,我得到了所需的输出,但是在错误的单元格中选择了所选按钮。
图 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按钮选择错误的主要内容,如果未能解决你的问题,请参考以下文章
在单元格中单击时,tableView:indexPathForCell 返回 nil