在我的应用程序中,我有一个充满单元格的TableView。一切正常 - 当我点击一个单元格时,它立即调用tableView:DidSelectRowAtIndexPath:
并执行一个segue,将我带到下一个屏幕。我还有一个搜索栏,使用UISearchDisplayController,允许用户搜索tableView中的项目。当我在搜索栏中输入一些文本时,匹配搜索的单元格会显示在表格中。
现在,我的问题是当我点击此搜索结果表中显示的其中一个单元格时......在初始点击时,表格视图不会以任何方式响应。如果短暂地按住水龙头,则细胞变为灰色,就好像它被选中一样,但是仍未调用tableView:DidSelectRowAtIndexPath:
,并且在释放水龙头后细胞恢复正常。但如果我长按几秒钟,最后会调用tableView:DidSelectRowAtIndexPath:
,然后我会进入正确的屏幕。
以前有人遇到过这个问题吗?据我所知,我已经以与以往一样的方式实现了我的UISearchDisplayController,并且从未遇到过这个问题。
谢谢,如果我能提供任何可能有帮助的其他信息,请告诉我
修改
我不确定问题究竟在哪里,所以我不确定要显示哪些方法,但这里有一些代码...... 我在点击UINavigationBar中的图标时调出搜索栏,然后在编辑完成后将其从超级视图中删除。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
NSArray *contentArray;
if (tableView == self.tableView) {
contentArray = self.postArray;
} else if (tableView == self.searchDisplayController.searchResultsTableView) {
contentArray = self.searchResults;
}
// This is pretty hackish, but it wasn't working before for some reason. So I send the PFObject I want as the sender
[self performSegueWithIdentifier:@"ShowPostDetails" sender:contentArray[indexPath.row]];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"PostCell";
PostTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell) {
cell = [[PostTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
[self updateSubviewsForCell:cell inTableView:tableView atIndexPath:indexPath];
/*
if (tableView == self.searchDisplayController.searchResultsTableView) {
[cell addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cellTapped:)]];
} */
return cell;
}
#pragma mark - Search Bar Delegate
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"text contains[c] %@", searchText];
self.searchResults = [self.postArray filteredArrayUsingPredicate:resultPredicate];
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString
scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
objectAtIndex:[self.searchDisplayController.searchBar
selectedScopeButtonIndex]]];
return YES;
}
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
{
[self.view addSubview:self.searchDisplayController.searchBar];
self.searchDisplayController.searchBar.center = CGPointMake(self.view.window.center.x, 42);
}
- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
[self.searchDisplayController.searchBar removeFromSuperview];
}
答案 0 :(得分:1)
我发现了我的问题......
遇到此问题的特定视图控制器是从包含这些委托方法的视图控制器创建的子类,并包含用于输入信息的UITextField。我看一下keyboardDidAppear通知,当它出现时,我在视图中添加一个UITapGestureRecognizer,通过在点击视图时重新设置UITextField的第一个响应者来关闭键盘。当我添加它时,我还没有实现搜索功能,所以我知道键盘弹出的唯一原因是UITextField。问题是,当为搜索栏弹出键盘时,这个额外的TapGestureRecognizer会阻止内置在UITableView单元格中的TapGestureRecognizer触发。我正在寻找问题的错误点。 为了解决这个问题,我只是在添加手势识别器之前检查了UITextField确实是第一个响应者。现在一切正常。
因此,对于遇到类似问题的其他人,我会说回去并确保您没有任何其他可能与您的tableView的手势识别器冲突的UIGestureRecognizer。
感谢所有评论的人。帮助引导我解决问题所在。