2014-12-16 17 views
6

Chcę dodać UISearchBar do UITableView, który ma już widoku nagłówka. Kiedy próbuję dodać pasek wyszukiwania do istniejącego widoku nagłówka, działa on, dopóki go nie dotknę, w którym momencie otrzymam The view hierarchy is not prepared for the constraint, co wydaje się być, ponieważ pasek wyszukiwania nie jest bezpośrednim podziałem widoku tabeli, więc kiedy UISearchController próbuje zaktualizować ograniczenia, których nie może.UISearchBar subview of UITableViewHeader?

Jedynym sposobem, jaki znalazłem, jest umieszczenie nagłówka w nagłówku paska wyszukiwania, a następnie wszystko działa poprawnie, ale oczywiście stracę pozostałe widoki, które były już w widoku nagłówka.

Odpowiedz

4

Aby obejść to zachowanie, umieszczam pasek wyszukiwania w kontenerze UIView. Zastosuj wiązania do tego widoku kontenera i użyj maski autouzupełniania dla paska wyszukiwania w kontenerze.

// 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, dziękuję! Poszukiwania i wypróbowanie różnych obejść zajęły mi całe dni, aż znalazłem Twój wpis. Ponieważ używam UISearchController mam dziwny problem, gdzie UISearchBar jest dodawany do searchBarContainer, ale potem, gdy sprawdzam w viewWillAppear to już nie jest, więc muszę ręcznie dodać go ponownie. Obecnie walczy z początkową dziwnością klatek po ponownym dodaniu UISearchBar jako wyeksportowania w kontenerze, ale jest to zdecydowanie w dobrym kierunku. –

+0

Może być konieczne dodanie tego w viewWillAppear: if (self.searchBarContainerView.subviews.count == 0) { [self.searchBarContainerView addSubview: self.searchController.searchBar]; // również musi naprawić wysokość ramki CGRect frame = self.searchBarContainerView.frame; frame.size.height = 44,0 f; self.searchBarContainerView.frame = frame; } –