2015-08-13 3 views
1

Я фильтрую массив, в то время как пользователь вводит текст в uisearchbar, но проблема в том, что у меня есть обработчик предупреждений, который срабатывает каждый раз, когда вызывается делегат, но я хочу, чтобы предупреждение появлялось только однократно, а не несколько раз ... код нижеКак отключить делегат UISearchBar один раз?

 -(void)searchBar:(UISearchBar)searchBar textDidChange:(NSString)searchText { 



    if(searchText.length == 0) 
    { 
     _isFiltered = FALSE; 
    } 
    else{ 
     // NSPredicate *resultPredicate=[NSPredicate predicateWithFormat:@"(SELF.name contains[cd] %@)or(SELF.rank contains[cd] %@)or(SELF.score contains[cd] %@)",searchText,searchText,searchText]; 
     NSPredicate *resultPredicate=[NSPredicate predicateWithFormat:@"(SELF contains[cd] %@)",searchText]; 
     self.filteredTableData = [self.searchItemsArray filteredArrayUsingPredicate:resultPredicate]; 
     NSLog(@"Predicated array %@", self.filteredTableData); 
     self.isFiltered = YES; 
     if (self.filteredTableData.count == 0) { 
      [[CLAlertHandler standardAlertHandler]showAlert:@"No match found!" title:AppName]; 
      [self.searchTableView reloadData]; 


     } 

    } 
    //[self.searchTableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade]; 
    [self.searchTableView reloadData]; 
} 

ответ

2

Каждый раз, когда метод делегата вызывается, используйте -[NSNotification enqueueNotification…], чтобы отправлять уведомления для себя, с приоритетом NSPostWhenIdle (к примеру) и маску Coalesce. Это объединит эти уведомления и сработает, когда система простаивает, в этом случае позволит вам работать, когда пользователь не печатает напрямую.

В файле реализации:

const NSString *myNotificationName = @"kMyNotificationName"; 

В viewWillAppear, или аналогичные:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(handleSearchFieldUpdate:) 
              name:myNotificationName object:self]; 

В методе делегата:

[[NSNotificationQueue defaultQueue] enqueueNotification:[NSNotification notificationWithName:myNotificationName object:self] 
              postingStyle:NSPostWhenIdle 
              coalesceMask:NSNotificationCoalescingOnName 
               forModes:nil]; 

В качестве нового метода класса:

- (void)handleSearchFieldUpdate:(NSNotification *)notification { 
    .. do your work .. 
} 

Конечный результат будет заключаться в том, что ваш селектор handleSearchFieldUpdate вызывается каждый раз, когда пользователь перестает печатать.

+0

, как использовать это ?? –

+0

Я добавил пошаговое руководство по внедрению. – Aderstedt

+0

Новое - [NSNotificationQueue enqueueNotification] ... Пожалуйста, отправьте образец кода в ответ. :) –

0

Почему бы не иметь логическую переменную, чтобы определить, было ли предупреждение ранее?

@interface ViewController() { //extension in .m file 

BOOL noResultsAlertShown; 

} 

Тогда

if (self.filteredTableData.count == 0 && !noResultsAlertShown) { 

    noResultsAlertShown = YES; 

    [[CLAlertHandler standardAlertHandler]showAlert:@"No match found!" title:AppName]; 
    [self.searchTableView reloadData]; 

} 
Смежные вопросы