2014-12-16 16 views
6

Voglio aggiungere un UISearchBar a un UITableView che ha già una vista di intestazione. Quando provo ad aggiungere la barra di ricerca alla vista dell'intestazione esistente funziona fino a quando non lo tocco, a quel punto ottengo The view hierarchy is not prepared for the constraint, che sembra essere perché la barra di ricerca non è una sottoview diretta della vista tabella in modo che quando UISearchController prova a aggiorna i vincoli che non puòSottoview UISearchBar di UITableViewHeader?

L'unico modo per aggirare ciò che ho trovato è rendere l'intestazione della vista tabella la barra di ricerca, quindi tutto funziona correttamente, ma ovviamente poi perdo le altre viste che erano già nella vista dell'intestazione.

risposta

4

Per aggirare questo comportamento, ho inserito la barra di ricerca in un contenitore UIView. Applicare i vincoli a questa vista contenitore e utilizzare una maschera di autorizzazione per la barra di ricerca all'interno del contenitore.

// Configure header view 
UIView *headerView = ... 
... 

// Create container view for search bar 
UIView *searchBarContainer = [UIView new]; 
searchBarContainer.translatesAutoresizingMaskIntoConstraints = NO; 
[searchBarContainer addSubview:self.searchBar]; 
[headerView addSubview:searchBarContainer]; 
self.searchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

// Apply constraints involving searchBarContainer 
[headerView addConstraint: ...]; 
... 

// Then add header to table view 
self.tableView.tableHeaderView = headerView; 
+0

Wow, grazie! Mi ci sono voluti giorni di ricerche e tentativi di soluzioni alternative fino a trovare il tuo post. Dal momento che sto usando UISearchController ho uno strano problema in cui UISearchBar viene aggiunto a searchBarContainer, ma poi quando eseguo il check in viewWillAppear non è più lì, quindi devo aggiungerlo manualmente di nuovo. Attualmente sto combattendo contro la stranezza del fotogramma iniziale dopo aver aggiunto nuovamente UISearchBar come sottomenu nel contenitore, ma questo è decisamente nella giusta direzione. –

+0

Potrebbe essere necessario aggiungere questo in viewWillAppear: if (self.searchBarContainerView.subviews.count == 0) { [self.searchBarContainerView addSubview: self.searchController.searchBar]; // anche per correggere l'altezza del frame CGRect frame = self.searchBarContainerView.frame; frame.size.height = 44.0f; self.searchBarContainerView.frame = frame; } –