2010-09-26 12 views

Odpowiedz

14

Jeśli - jak ja - uważasz, że zwykły TableView był zbyt brzydki, możesz zrezygnować z używania SearchDisplayController.

Właśnie:

  • włożony w pustym Zobacz searchBar i Tableview jak zwykle robimy dla IBOutlet
  • wybrany właściciel plik jako delegat dla obojga.
  • Na początku liczba sekcji wynosi 0 ([myTab count]), a następnie użyłem reloadData i tym razem myTab jest zapełniany wynikiem.
  • [self.resultTableView reloadData];

Tutaj można znaleźć wszystkie metody użyłem z delegatów

@interface MyViewController : UIViewController <UIApplicationDelegate, UISearchBarDelegate> { 

    IBOutlet UISearchBar *searchBar; 
    IBOutlet UITableView *resultTableView; 
} 

@property (nonatomic, retain) IBOutlet UISearchBar *searchBar; 
@property (nonatomic, retain) IBOutlet UITableView *resultTableView; 

    //For your searchBar the 2 most important methods are 
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBarClicked; 
- (BOOL)searchBarTextDidEndEditing; 


    //For your TableView the most important methods are in my case: 

    //number of sections in the table view. 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; 
    //HEADERS 
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section; 
    //different numbers of row by section 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 
    //the cells themselves 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 

@end 

Po tym wszystkim, najprostszym rozwiązaniem jest często najlepszym ...

+1

To jest świetny wgląd i naprawdę usprawniono korzystanie z wyszukiwania pasek w mojej aplikacji. Dzięki! – Luke

0

Nie jest to możliwe, ponieważ właściwość searchResultsTableView to readonly.

+0

więc w zasadzie nie ma absolutnie żadnego sposobu, aby zmienić styl zgrupowane? to absurd, że jabłko powstrzymałoby nas od zrobienia czegoś takiego. – Noam

+0

@ David, wiem, że jest do bani. :( –

1

można spróbować stworzyć podklasę UISearchDisplayController i uczynić searchResultsTableView przeszukiwać

w dowolnym .h plików dodatek:

@interface YourUISearchDisplayController : UISearchDisplayController { 
    UITableView * searchResultsTableView; 
} 

@property (nonatomic) UITableView * searchResultsTableView; 

@end; 

Następnie wystarczy użyć YourUISearchDisplayController zamiast od UISearchDisplayController.

Uwaga: może być konieczne użycie (nieatomowy, zachowaj), (nieatomowy, przypisz) lub (nieatomowy, skopiuj). Nie jestem do końca pewien

+0

"Następnie wystarczy użyć YourUISearchDisplayController zamiast UISearchDisplayController" Więc to co zrobiłem: myUISearchDisplayController = [[MyUISearchDisplayController alloc] initWithStyle: UITableViewStyleGrouped]; \t self.searchDisplayController.searchResultsTableView = myUISearchDisplayController.searchResultsTableView; Ale daje mi błąd, że "/RootViewController.m: 472: błąd: obiekt nie może być ustawiony - albo właściwość readonly lub nie znaleziono settera " Czy istnieje obejście? – Noam

+0

@ David, nie sądzę, że to możliwe aby zastąpić właściwości w Objective-C, możliwe jest tylko przesłonięcie ** metod **. –

+0

Tak, ja Wygląda na to, że nie masz szczęścia. Okazuje się, nawet jeśli piszesz settery dla właściwości tylko do odczytu, które po prostu wciąż nazywają sobą. –

0

Zastępowanie -searchResultsTableView nie będzie działać, ponieważ UISearchDisplayController uzyskuje bezpośredni dostęp do zmiennej instancji widoku tabeli bez wywoływania metody.

Wyznaczony inicjator dla UISearchDisplayController wydaje się być metodą prywatną, -initWithSearchBar:contentsController:searchResultsTableViewStyle:, która ustawia zmienną instancji _searchResultsTableViewStyle. Ta zmienna instancji służy do tworzenia widoku tabeli wyników wyszukiwania. Publiczny inicjator wywołuje tę metodę, przekazując UITableViewStylePlain.

Bezpośrednio wywołując prywatnego wyznaczony inicjator albo ustawiając zmienną instancji najprawdopodobniej dostać wniosek odrzucony z App Store, więc może zamiast próbować przesłanianie inicjator publicznego i wywołanie

[self setValue:[NSNumber numberWithInt:UITableViewStyleGrouped] 
     forKey:@"searchResultsTableViewStyle"]; 
3

Działa to dla mnie:

Tworzenie klasy, która rozciąga UISearchDisplayController:

@interface RVSearchDisplayController : UISearchDisplayController 
@end 

@implementation RVSearchDisplayController 

-(UITableView *) searchResultsTableView { 
    [self setValue:[NSNumber numberWithInt:UITableViewStyleGrouped] 
      forKey:@"_searchResultsTableViewStyle"]; 
    return [super searchResultsTableView]; 
} 

@end 

następnie dodać UISearchDisplayController do tabeli przy użyciu IB i zmień jego klasę niestandardową na RVSearchDisplayController w Inspektorze tożsamości.

+3

Czy to się liczy jako używanie prywatnego interfejsu API? – chakrit

15

Ten pracował dla mnie (iOS 5.0):

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self]; 
[self.searchController setValue:[NSNumber numberWithInt:UITableViewStyleGrouped] 
     forKey:@"_searchResultsTableViewStyle"]; 
+0

To właściwie najlepsze rozwiązanie w tym poście. DZIĘKI! – jcdmb

+0

To działa również dla mnie, iOS 5.1 – jxdwinter

+6

'_searchResultsTableViewStyle' nie wydaje się być udokumentowane ... Czy to przejdzie akceptację Apple? –

Powiązane problemy