Мне нужно отменить селектор.Есть ли у меня 100% гарантия, что я отменил селектор? - PullRequest
1 голос
/ 05 декабря 2011

Я хочу изменить текст в UISearchBar, но я не хочу вызывать executeSearch.Я мог отменить селектор двумя способами.

Первый способ: я использую метод func1.

@property (nonatomic, retain) IBOutlet UISearchBar *searchBar;
-(void) func1
{
  self.searchBar.delegate = self;
  self.searchBar.text = @"";
  [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(performSearch:) object:nil];
}

- (void)searchBar:(UISearchBar *)searchBar_ textDidChange:(NSString *)searchText
{
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(performSearch:) object:nil];
    [self performSelector:@selector(performSearch:) withObject:nil afterDelay:1];
} 

Второй способ: я использую func2

-(void) func2
{
  self.searchBar.delegate = nil;
  self.searchBar.text = @"";
  self.searchBar.delegate = self;
}

Есть ли у меня 100% гарантия, что я отменил селектор в func1?Func2 лучше?

ОБНОВЛЕНИЕ: я ищу универсальные решения, а не только self.searchBar.text = @""; или self.searchBar.text = @"Restaurants";.

Ответы [ 3 ]

3 голосов
/ 08 декабря 2011

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

Второе решение несколько более надежно, вы удаляете делегата. Таким образом, гарантируется, что делегат не будет вызван, потому что его там нет. Но 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:, если это лучше соответствует вашим потребностям, чем мое предложение!

Удачи!

0 голосов
/ 08 декабря 2011

Чтобы ответить на заданный вами вопрос: да.У меня никогда не было проблем с cancelPreviousPerformRequestsWithTarget: не делать то, что он должен делать.

Но я бы склонялся к подходу ignoreChanges, а не к публикации и отмене сообщений.

0 голосов
/ 07 декабря 2011

Попробуйте найти Подклассы NSOperation, чтобы быть параллельными и отменяемыми

с BJ Homer ответ, который хорошо объясняет, как ее решить

надеждаэто тебе поможет!

...