5

UISearchDisplayController ürününü, UITableViewController ürününe InterfaceBuilder ürününe ekledim. Tablo için veri dizisini yeniden üreten ve reloadData'u çağıran bir searchBar: searchBar textDidChange: searchText yöntemi ekleyerek çalışmasını sağlamak çok kolaydı.UISearchDisplayController kullanarak arama nasıl yüklenir veya başlatılır?

Ancak, arama çubuğunda kullanıcılar bir dahaki sefere daha önceki arama gösterisine sahip olmak isterim çünkü (X) 'e dokunmak ve tekrar yazmaktan daha kolaydır. Ama bunu yapamıyorum.

- (void) searchBar: (UISearchBar *) searchBar textDidChange: (NSString *) searchText { 
    if(searchText && [searchText length] > 0) { 
     self.displayedRows = [[NSMutableArray initWithCapacity: 1]; 
     for(NSString *l in self.allRows) { 
      NSRange r = [l rangeOfString: searchText]; 
      if(r.location != NSNotFound) 
       [self.displayedRows addObject: l]; 
     } 
     [self.searchDisplayController.searchResultsTableView reloadData]; 
    } 
} 

- (void) searchDisplayControllerWillBeginSearch: (UISearchDisplayController *) controller { 
    if(self.lastSearch && [self.lastSearch length] > 0) { 
     controller.searchBar.text = self.lastSearch; 
     [controller.searchResultsTableView reloadData]; 
    } 
} 

- (void) searchDisplayControllerWillEndSearch: (UISearchDisplayController *) controller { 
    self.lastSearch = controller.searchBar.text; 
    self.displayedRows = self.allRows; 
    [self.tableView reloadData]; 
} 

son arama metin Aramayı dokunma ve ben 'imleci' bile sonunda yerleştirilmiş olduğunu şaşırdı ama bir dahaki sefere bar arayışında uygun olduğunu Aşağıda denedim kodudur arama sonuçları gösterilmiyor, sadece arama alanının boş olduğu gibi orijinal içeriğin karanlık görünümü. Bir karakteri yazdığım anda arama sonuçları güncellenir. Ben her birine [self.searchDisplayController.searchResultsTableView reloadData] eşdeğer koyarak denedim

:

searchDisplayControllerDidBeginSearch: (UISearchDisplayController *) controller 
searchDisplayController: (UISearchDisplayController *) controller didLoadSearchResultsTableView: (UITableView *) tableView 
searchDisplayController: (UISearchDisplayController *) controller willShowSearchResultsTableView: (UITableView *) tableView 
searchDisplayController: (UISearchDisplayController *) controller didShowSearchResultsTableView: (UITableView *) tableView 

Ama hiç fark ... bir şey yazana kadar sadece boş yaptı.

Önceden yüklenmiş bir arama sonucunu nasıl alacakları konusunda herhangi bir fikri olan var mı? başka bir değişiklik yapmanız gerekiyorsa

- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller { 
    if(lastSearch.length > 0) { 
     NSLog(@"In searchDisplayControllerDidBeginSearch"); 
     [self.searchDisplayController.searchBar setText:lastSearch]; 
    } 
} 

, şimdi açacak kadar UIKit başlıkları UISearchBar.h ve UISearchDisplayController.h ve nerede meşgul ederek ne bakarak önermek:

cevap

7

Böyle bir şey lazım. Ayrıca, NSLog arkadaşınız =)

Ayrıca

Sadece etmiştir neler olduğunu ve bu ...searchBar.text = lastSearch farklıdır nasıl setText kuvvetler textDidChange, sırayla arama redoes olan kayıt yaptırma ve sonradan açıklamaktır shouldReloadTableForSearchString numaralı telefonu arayın. Sadece setText kullanmadan metni değiştirmek (bazı nedenlerden dolayı) textDidChange'u tetiklemez.

+0

İnanılmaz, tüm farklı willBegins ve didBegins olası her kombinasyonu denedim sanıyordum ama ben sadece önceki arama testi her zaman arama alanında olduğu için 'reloadData 'parçası hareket ediyordum. – LavaSlider

+0

Denedim, denedim gibi, 'controller.searchBar.text = self.lastSearch' hareket ettirmeyi önerdi ve presto, işe yaramaz (ki bu biraz karanlık-flaşın sahip olmaması hoş olurdu). "ReloadData" ye ihtiyaç duymuyorum bile. Teşekkürler. – LavaSlider

+0

(Oh, ve çok fazla NSLog vardı). Yöntemler girip çıkarken ve alan içeriği ve dizi boyutlarını gösterirken onları aldım ... sadece güncellenmez). – LavaSlider

İlgili konular