问题
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