Первый метод довольно сложный, вы вызываете методы и пытаетесь их отменить. Если отмена не приходит в нужное время, метод будет вызван. Так что не делайте этого, это кошмар, если приложение растет и ситуация усложняется.
Второе решение несколько более надежно, вы удаляете делегата. Таким образом, гарантируется, что делегат не будет вызван, потому что его там нет. Но iOS также не может вызвать делегата для других вещей, которые вы, возможно, захотите обработать. Кроме того; Вы должны проверить это на устройстве, потому что я думаю, что iOS удалит все результаты, когда нет делегата, который возвращает какие-либо результаты. Но это будет зависеть от того, как вы реализовали другие части поиска.
Мой совет: реализовать метод searchDisplayController:shouldReloadTableForSearchString:
из протокола UISearchDisplayDelegate
. С помощью этого метода вы можете контролировать, должна ли панель поиска перезагружать таблицу с результатами поиска. Прямо перед тем, как вы измените строку поиска самостоятельно, установите флаг, так что этот метод теперь, когда и что возвращает.
Пример псевдокода:
BOOL ignoreChanges = NO;
-(void)editSearchString
{
ignoreChanges = YES;
self.searchBar.text = @"some_string";
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
BOOL shouldReload = !ignoreChanges;
ignoreChanges = NO;
return shouldReload;
}
Таким образом, вы игнорируете изменение строки поиска, сделанное вашим кодом, но вы будете уважать изменения, сделанные пользователем. Конечно, можно поставить проверку на логическое значение ignoreChanges
в другой функции, например, метод searchBar:textDidChange:
, если это лучше соответствует вашим потребностям, чем мое предложение!
Удачи!