UISearchBar губи фокус

Имам UISearchBar за UITableView и моето внедряване е както следва:

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    [self.searchBar becomeFirstResponder];
    if(searchText.length == 0)
    {
        self.isFiltered = NO;     
    }
    else
    {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.writer1 contains[c] %@", searchText];
        self.isFiltered = YES;
        [[RTRepairOrderStore sharedStore] filterROArray:predicate];
    }

    [self.tableView reloadData];    
}

Проблемът е, че след като напиша една буква в лентата за търсене, търсенето работи, но клавиатурата веднага се отхвърля. Как мога да предотвратя това?


person Giardino    schedule 25.09.2014    source източник
comment
ето правилния отговор на този въпрос: stackoverflow.com/a/25796944/4833705   -  person Lance Samaria    schedule 26.08.2020


Отговори (4)


Лентата за търсене губи фокус, защото вероятно се намира в заглавката на tableView, а tableView се презарежда.

Можете да предотвратите това чрез:

  • Преместване на лентата за търсене, така че вече да не е подизглед на tableView. Опциите включват поставяне на лентата за търсене в лента за навигация или в изглед над tableView.

  • Замяна на reloadData с един от следните подходи, за да се избегне презареждането на заглавката tableView:

    • Използвайте reloadSections:withRowAnimation:, за да презаредите раздел от таблицата, или

    • Използвайте beginUpdates endUpdates, за да анимирате промени за конкретни редове, които да бъдат вмъкнати или изтрити.

person Community    schedule 25.10.2014

Това, което работи за мен, е да направя извикването на becomeFirstResponder да се случи след reloadData:

[self.tableView reloadData];
[self.searchBar becomeFirstResponder];

Това работи на iOS 8.1.2, все още не съм го тествал на други версии.

person Gian Franco Zabarino    schedule 05.01.2015

Имах същите проблеми, които срещнах по-горе, но по друга причина. Моят UISearchBar беше в клетка в горната част на таблицата. Когато въвеждах, извиквах за презареждане на UITableView и това караше лентата за търсене да губи фокус - защото клетката, съдържаща лентата за търсене, беше тази, която се презареждаше.

Решението беше да презаредя само клетките, от които имах нужда. Моята лента за търсене беше в раздел 0, а всички резултати от търсенето в раздел едно. Така че обаждане като това гарантира, че само раздел 1 е презареден и лентата за търсене не губи фокус.

NSIndexSet *section1 = [NSIndexSet indexSetWithIndex:1];
[self.tableView reloadSections:section1 withRowAnimation:UITableViewRowAnimationAutomatic];
person Luke Smith    schedule 14.06.2016

Когато се извика searchBar:textDidChange:, searchBar е FirstResponder. Няма нужда да му изпращате becomeFirstResponder съобщение.
Освен това вие изпращате becomeFirstResponder до self.searchBar, което може да не е същото като searchBar, което ви е прехвърлено по време на извикването на метода searchBar:textDidChange:.
Предлагам да изтриете [self.searchBar becomeFirstResponder]; и да проверите дали вашето свойство self.searchBar наистина е свързано с обекта searchBar в обратното извикване searchBar:textDidChange:.

person Reinhard Männer    schedule 25.09.2014