UISearchController dimsBackgroundDuringPresentation только когда поисковый текст пуст

У меня есть UISearchController и UITableView. Код в viewDidLoad:

self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.dimsBackgroundDuringPresentation = YES;
[self.searchController.searchBar sizeToFit];
self.searchController.searchBar.delegate = self;
self.searchController.delegate = self;

self.tableView.tableHeaderView = self.searchController.searchBar;
self.tableView.userInteractionEnabled = YES;

Я хочу, чтобы серый вид отображался всякий раз, когда я нажимаю на панель поиска, и когда я начинаю печатать, серое представление исчезает и показывает tableView, чтобы я мог нажимать на ячейки. Это означает, что серый вид появляется только тогда, когда панель поиска пуста (точно так же, как поведение поиска по умолчанию в приложениях Почта и Контакты). Я попытался установить

self.searchController.dimsBackgroundDuringPresentation 

в методе делегата на основе searchBar.text

-(void )searchBarTextDidBeginEditing:(UISearchBar *)searchBar

Но это не работает. Любые идеи?

Спасибо,


person Missa    schedule 18.11.2015    source источник
comment
Так работает dimsBackgroundDuringPresentation. Как вы внедряете uisearchcontroller? Это только не омрачит результаты поиска. Похоже, вы их, скорее всего, не представляете.   -  person beyowulf    schedule 18.11.2015
comment
Это все, что я сделал для UISearchController. все остальное реализуется табличным представлением и (недействительным) updateSearchResultsForSearchController: (UISearchController *) searchController перезагружает представление таблы на основе поискового текста. есть ли еще что-нибудь, что мне нужно сделать?   -  person Missa    schedule 18.11.2015
comment
К сожалению, это намного сложнее. Вам нужно выполнить поиск в источнике данных вашего табличного представления и найти результаты поиска, а затем представить их пользователю. Вы можете найти руководство о том, как это сделать, здесь: jhof.me/simple-uisearchcontroller-implementation   -  person beyowulf    schedule 18.11.2015
comment
@beyowulf Да, я следил за инструкцией, и она сработала. Спасибо.   -  person Missa    schedule 19.11.2015
comment
Я рад, что у вас все получилось.   -  person beyowulf    schedule 19.11.2015
comment
Но должен быть способ динамически установить свойство dimsBackgroundDuringPresentation. Вам было легко написать новую таблицу, но если таблица сложная, многие разработчики предпочитают использовать один и тот же контроллер для отображения результатов, что делать в таком случае? Проблема все еще существует.   -  person Mayur Kothawade    schedule 30.08.2016
comment
@Missa Я тоже столкнулся с этой проблемой, не могли бы вы мне помочь? Я проверил ссылку на руководство, но она не открывается.   -  person Parth Barot    schedule 02.05.2019
comment
@ParthBarot Надеюсь, это поможет: raywenderlich.com/   -  person Missa    schedule 06.05.2019


Ответы (3)


self.searchController.dimsBackgroundDuringPresentation = YES полезно, если вы используете другой контроллер представления для searchResultsController. Но в вашем коде вы используете текущее представление для отображения результатов ([[UISearchController alloc] initWithSearchResultsController:nil]).

Я хочу, чтобы серый вид отображался всякий раз, когда я нажимаю на панель поиска, и когда я начинаю вводить текст, серый вид исчезает и показывает tableView, чтобы я мог нажимать на ячейки.

Это поведение по умолчанию, если вы используете другой контроллер представления для searchResultsController.

person Parag Bafna    schedule 29.06.2016
comment
Я думаю, что Apple должна отключить этот странный и бесполезный эффект с помощью исключения или может быть предупреждение в журнале ... Я имею в виду, что если вы выберете searchResultsController как current (nil), тогда dimsBackgroundDuringPresentation никогда не будет YES. - person m8labs; 05.11.2016

Я добавил subView для таблицы, когда таблица отображается, и установил серый цвет и Alpha. когда Dismiss SearchController удалил подпредставление. Я установил свойство dim как false. Мой код, как показано ниже, может вам помочь. Я использовал ту же таблицу для отображения результатов поиска.

// on header file
UIView *dimView = null; 

//on .m file

       // create DimView for SearchControl
    - (void)showDimView
    {
        if(dimView == nil && self.searchController.active)
        {
            CGRect rcReplacementView = self.tableView.frame;
            dimView = [[UIView alloc] initWithFrame:rcReplacementView];
            dimView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
            dimView.backgroundColor  = [UIColor blackColor];
            dimView.alpha = 0.5;
            [self.view addSubview:dimView];
            self.tableView.scrollEnabled = NO;

            //tap event for hide seachcontroll 
            UITapGestureRecognizer *singleFingerTap =
            [[UITapGestureRecognizer alloc] initWithTarget:self
                                                    action:@selector(handleSingleTap:)];
            [dimView addGestureRecognizer:singleFingerTap];
            [singleFingerTap release];
        }
    }

//close SearchController if Tap on view
- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer {

    if(searchController.searchBar.text.length <= 0)
    {
        [self.searchController setActive:NO];
    }
}

// do something before the search controller is dismissed
- (void)willDismissSearchController:(UISearchController *)searchController {

    if(dimView != nil)
    {
        [dimView removeFromSuperview];
        dimView = nil;
    }
    self.tableView.scrollEnabled = YES;
}
person Sabareesh    schedule 20.11.2015
comment
Спасибо, я предпочитаю реализовать стандартную реализацию от Apple. - person Missa; 01.12.2015

Один из хакерских подходов - установить для фона UISearchController светло-серый цвет при инициализации UISearchController и установить dimsBackgroundDuringPresentation или obscuresBackgroundDuringPresentation на false, а затем в методе делегата textDidChange измените фон на чистый.

(void)viewDidLoad()
{
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.searchController.searchResultsUpdater = self;
    self.searchController.searchBar.placeholder = NSLocalizedString(@"Search", @"");
    self.searchController.view.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.2f];
    self.searchController.dimsBackgroundDuringPresentation = false;
    [searchController.searchBar sizeToFit];
}

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    NSUInteger length = [searchText length];
    if (length > 0)
    {
        self.searchController.view.backgroundColor = [UIColor clearColor];
        [self.searchController.view reloadInputViews];
    } else {
        self.searchController.view.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.2f];
        [self.searchController.view reloadInputViews];
    }

}
person Shahriyar    schedule 02.09.2019