我创建了以下代码,但还有一件事让我烦恼。出于某种原因,当我按下键盘上的任何键时,它立即消失,我的取消栏被禁用,但代码工作正常排序并显示我的表视图中具有用户输入的字母的单元格,虽然一次只有一个。有什么我想念的吗?感谢。
编辑:
这是我正在使用的一些代码。可能有助于解决这个问题。
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
return [self headerView];
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return [[self headerView] frame].size.height;
}
- (UIView *)headerView
{
if (headerView)
return headerView;
float w = [[UIScreen mainScreen] bounds].size.width;
CGRect evHeaderFrame = CGRectMake(0.0, 0.0, w, 45.0);
theSearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 45)];
theSearchBar.showsCancelButton=YES;
theSearchBar.autocorrectionType=UITextAutocorrectionTypeNo;
theSearchBar.autocapitalizationType=UITextAutocapitalizationTypeNone;
theSearchBar.delegate = self;
headerView = [[UIView alloc] initWithFrame:evHeaderFrame];
[headerView addSubview:theSearchBar];
searching = NO;
return headerView;
[headerView release];
}
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
if(searching)
return;
searching = YES;
NSLog(@"Search Bar Text Did Begin Editing");
}
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
NSLog(@"Did End Editing");
}
- (void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText {
[copyListOfItems removeAllObjects];
if([searchText length] > 0) {
NSLog(@"Search Length is greater than 0");
searching = YES;
self.tableView.scrollEnabled = YES;
[self searchTableView];
}
else {
NSLog(@"Search Length is less than 1");
searching = NO;
self.tableView.scrollEnabled = YES;
}
[self.tableView reloadData];
}
- (void) searchBarSearchButtonClicked:(UISearchBar *)theSearchBar {
[self searchTableView];
}
- (void) searchTableView {
NSString *searchText = theSearchBar.text;
NSMutableArray *searchArray = [[NSMutableArray alloc] init];
for (int i = 0; i < [customArray count]; i++){
NSRange titleResultsRange = [[[customArray objectAtIndex:i] objectAtIndex:0] rangeOfString:searchText options:NSCaseInsensitiveSearch];
if (titleResultsRange.length > 0)
//NSLog(@"%@ , %@",searchText,[customArray objectAtIndex:i]);
[copyListOfItems addObject:[customArray objectAtIndex:i]];
}
//NSLog(@"CopyListOfItems : %@",copyListOfItems);
[searchArray release];
searchArray = nil;
}
- (void) doneSearching_Clicked:(id)sender {
theSearchBar.text = @"";
NSLog(@"RESIGN FIRST RESPONDER");
[theSearchBar resignFirstResponder];
searching = NO;
self.navigationItem.rightBarButtonItem = nil;
self.tableView.scrollEnabled = YES;
[self.tableView reloadData];
}
看起来问题是[self.tableView reloadData];。看起来我必须找到一种将搜索栏放在屏幕上的新方法。
答案 0 :(得分:1)
不要在Section Header
中添加,而是在Tableview
标题上添加。
它对我有用。
答案 1 :(得分:0)
在NSLog(@"resign keybord");
之前尝试[searchBar resignFirstResponder];
,看看它是否在控制台中显示了某些内容。如果是,请尝试找出调用该函数的原因。检查NIB文件中的连接以及代理。
答案 2 :(得分:0)
如果我已经理解了您的问题,搜索数据会导致UIKeyboard的速度变慢,对于输入的每个字符,您都会立即搜索数据。尝试仅在返回时搜索数据?
答案 3 :(得分:0)
这可能是因为你正在重新加载整个TableView,它一旦进行过滤就会保存UISearchBar(这是在searchBar中的每个字符更改时进行的)。因此,您可能应该将重新加载限制为包含数据的部分,并且不应重新加载包含UISearchBar的部分。
对象C:
[tableViewOutlet reloadSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationNone];
斯威夫特2:
tableViewOutlet.reloadSections(NSIndexSet(index: section), withRowAnimation: .Automatic)