Цель-c uisearchbar позволяет только один символ за один раз - PullRequest
2 голосов
/ 08 сентября 2011

Я создал следующий код, но есть еще одна вещь, которая меня беспокоит. По какой-то причине, когда я нажимаю любую клавишу на клавиатуре, она немедленно исчезает, моя строка отмены отключена, но код работает, и он правильно сортирует и отображает ячейки в моем табличном представлении, в которых есть те буквы, которые набрал пользователь, хотя только по одному. Я что-то упускаю? Спасибо.

Edit:

Вот код, который я использую. Может помочь понять это.

- (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] ;. Похоже, мне нужно будет найти новый способ размещения строки поиска на экране.

Ответы [ 4 ]

1 голос
/ 01 февраля 2013

Вместо добавления в Section Header, попробуйте добавить его в заголовок Tableview.

Это сработало для меня.

0 голосов
/ 17 марта 2016

Это может быть связано с тем, что вы перезагружаете весь TableView, который содержит UISearchBar, после выполнения фильтрации (которая выполняется при каждом изменении символа в searchBar). Поэтому, вероятно, вам следует ограничить перезагрузку разделом, содержащим данные, и не следует перезагружать раздел, содержащий UISearchBar.

Obj C:

[tableViewOutlet reloadSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationNone];

Swift 2:

tableViewOutlet.reloadSections(NSIndexSet(index: section), withRowAnimation: .Automatic)
0 голосов
/ 09 сентября 2011

Если я понял вашу проблему, поиск данных вызывает замедление работы UIKeyboard, так как для каждого введенного символа вы сразу же ищете данные. Попробуйте только поискать данные по возвращении?

0 голосов
/ 09 сентября 2011

Попробуйте NSLog(@"resign keybord"); непосредственно перед [searchBar resignFirstResponder]; и посмотрите, показывает ли это что-то в консоли.Если да, попробуйте выяснить, почему эта функция вызывается.Проверьте соединения в файле NIB, а также делегаты.

...