У меня есть список вещей, предоставленных системой (например, брендов), которые не редактируются пользователем, но должны время от времени меняться.
Контекст
Эти элементы отображаются в виде таблицы и доступны для поиска с помощью UISearchDisplayController по умолчанию. Однако, поскольку список вещей явно не полон, я хочу дать пользователям возможность запрашивать добавление других вещей в список. Для этого я добавил представление нижнего колонтитула таблицы как в исходное представление таблицы, так и в представление таблицы результатов поиска, в котором есть кнопка для отправки почты.
Проблема
Он отлично работает, пока таблица результатов поиска все еще содержит записи. Нижний колонтитул моей таблицы отображается под результатами поиска, и все в порядке.
Однако, если по поисковому запросу результатов не найдено, контроллер отображения поиска отображает метку «нет результатов», расположенную по центру над табличным представлением. Обычно это выглядит отлично, вот так:
Но поскольку мой tableFooterView все еще отображается (а я хочу, чтобы он был!), Метка «нет результатов» перекрывает мой вид нижнего колонтитула и выглядит паршиво:
Я думаю, что в моем случае мне не нужна метка «нет результата», поскольку мой вид нижнего колонтитула дает разумно понять, что результатов нет и что с этим делать. Я тоже не возражаю, если это не пересекается.
Вопрос
Как я могу либо
- сделать так, чтобы в режиме поиска не отображалась метка "Нет результатов"
- или настройте его отображение (-> без перекрытия)
Если это невозможно, я также открыт для предложений по другим способам отображения нижнего колонтитула (не в виде нижнего колонтитула), у которых не было бы этой проблемы. Но мне нравится это решение, так как я могу использовать его в обоих случаях (обычное табличное представление и табличное представление результатов поиска) без каких-либо изменений.
5 ответов
Прежде всего, важно помнить, что использование UISearchDisplayController
- это компромисс между настраиваемостью и удобством. Вы получаете много автоматических вещей бесплатно, но если вам требуется много настроек, это может не соответствовать вашим потребностям. Лучше всего он работает как промежуточное решение, и если вы действительно хотите его использовать, я рекомендую вам поработать с ним в приложении, а не пытаться взломать его поведение.
С учетом сказанного, почему бы вам не заставить UITableView
возвращать одну строку, если результатов нет? Эта строка может быть пустой, отображать шаблонный текст или изображение (грустное лицо или что-то юмористическое, подходящее для приложения).
Если будет представлена одна строка, метка по умолчанию «Нет результатов» из UISearchDisplayController
не будет отображаться. Это поведение по умолчанию для многих приложений, таких как Instagram (посмотрите вкладку «Обзор»), Kindle и Notes.app по умолчанию, хотя они, вероятно, не используют UISearchDisplayController
.
Если вы обнаружите, что этот обходной путь не подходит для вашего приложения, вы также можете попробовать превратить представление «Отсутствует бренд» в представление заголовка первого раздела UISearchResultsTableView
(вместо представления нижнего колонтитула). В этом случае метка «Нет результатов» будет отображаться под ним. Было бы даже лучше объединить эту идею с одной пустой строкой.
Третий вариант - вставить это представление поверх UISearchResultsTableView
. Это можно было делать каждый раз, когда не было результатов (при необходимости, удаляя его должным образом) или только один раз, используя его свойство hidden, чтобы вместо этого показать или скрыть его.
Любой другой способ скрыть эту метку, вероятно, является хакерским, например этот: https://stackoverflow.com/a/11715841/382834 а>. Хотя ваша текущая логика проще, в дальнейшем это может иметь негативные последствия, так что, возможно, это худший путь для следования.
Используйте приведенный ниже код, чтобы удалить текстовое значение "нет результата"
- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView {
if (!isChangedNoResults) {
if ([contactManager.filteredPeople count] == 0) {
[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(changeNoResultsText:) userInfo:nil repeats:YES];
}
}}
Изменить метод текста.
- (void) changeNoResultsText:(NSTimer *)timer {
if (isChangedNoResults) {
[timer invalidate];
}
else {
for (UIView *subview in [self.searchDisplayController.searchResultsTableView subviews]) {
if ([subview isKindOfClass:[UILabel class]]) {
UILabel *targetLabel = (UILabel *)subview;
if ([targetLabel.text isEqualToString:@"No Results"]) {
NSLog(@"Changed!");
[targetLabel setText:@"_____"];
isChangedNoResults = YES;
[timer invalidate];
}
}
}
}
}
Или выполните приведенный ниже код в методе поиска
- (BOOL) searchDisplayController: (UISearchDisplayController *) контроллер shouldReloadTableForSearchString: (NSString *) searchString {
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.001);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
for (UIView* v in self.searchDisplayController.searchResultsTableView.subviews) {
if ([v isKindOfClass: [UILabel class]] &&
[[(UILabel*)v text] isEqualToString:@"No Results"]) {
[(UILabel*)v setText:@""];
break;
}
}
});
Это действительно полезно для меня ,, попробуйте это
Я хотел бы показать вам свое решение.
Сначала я написал несколько категорий. Первая категория дает нам таблицу UISearchDisplayController
.
@interface UITableViewController (YourUITableViewControllerCategory)
- (UITableView *) tableViewSearch;
@end
@implementation UITableViewController (YourUITableViewControllerCategory)
- (UITableView *) tableViewSearch
{
if ([self respondsToSelector:@selector(searchDisplayController)])
{
id searchDisplayController = [self performSelector:@selector(searchDisplayController)];
if ([searchDisplayController respondsToSelector:@selector(searchResultsTableView)])
{
id searchResultsTableView = [searchDisplayController performSelector:@selector(searchResultsTableView)];
if ([searchResultsTableView isKindOfClass:[UITableView class]]) return searchResultsTableView;
}
}
return [UITableView new];
}
@end
Вторая категория возвращает массив подпредставлений определенного типа.
@interface UIView (YourUIViewCategory)
- (NSArray *) viewsWithClass:(NSString *)class;
@end
@implementation UIView (YourUIViewCategory)
- (NSArray *) viewsWithClass:(NSString *)class
{
NSMutableArray *array = [NSMutableArray new];
for (UIView *view in self.subviews)
{
if ([view isMemberOfClass:NSClassFromString(class)])
{
[array addObject:view];
}
[array addObjectsFromArray:[view viewsWithClass:class]];
}
return array;
}
@end
Теперь вы почти готовы к поиску метки «Нет результатов». Вы должны убедиться, что на всех ярлыках в ваших ячейках есть tag != 0
.
- (BOOL) searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
for (UILabel *label in [self.tableViewSearch viewsWithClass:NSStringFromClass([UILabel class])])
{
if (label.tag == 0)
{
// found it! do whatever you want with label
}
}
return NO;
}
Это просто мой подход. Вы можете найти свой собственный путь. Удачи!
Я обнаружил, нет ли результатов 0. Если есть 0 результатов, я изменил numberOfRowsInSection, чтобы вернуть 1, heightForRowAtIndexPath, чтобы вернуть 0, и cellForRowAtIndexPath, чтобы вернуть общий UITableViewCell.
Вот и все. Нижний колонтитул показан во всей красе.
Используйте UISearchBar. Он не скроет панель навигации.
Импортировать делегата UISearchBar <UISearchBarDelegate>
Не забудьте подключить делегата к панели поиска
[yourSearchbar setDelegate:self]
Затем добавьте эти методы делегата,
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
// Put here in search what you want.
}
- (void)searchBarTextDidEndEditing:(UISearchBar *)aSearchBar
{
[aSearchBar resignFirstResponder];
}
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
[searchBar setShowsCancelButton:YES animated:YES];
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
[searchBar resignFirstResponder];
}
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{
[searchBar resignFirstResponder];
}
Похожие вопросы
Связанные вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.