ios - use - swift search bar with table view




O iOS 9 searchBar desaparece da exibição do cabeçalho da tabela quando o UISearchController está ativo (9)

A estrutura:

View1 (clique em um botão) -> presente modally (MyModalView: UITableViewController)

MyModalView tem UISearchController incorporado. O searchBar do UISearchController é colocado em MyModalView.tableView.tableHeaderView.

Está funcionando bem desde o iOS 8.0. No entanto, no iOS 9, o searchBar desaparece quando o UISearchController está ativo. Por favor, dê uma olhada nessas fotos abaixo

A visão modal:

UISearchController ativo no iOS 8:

UISearchController ativo no iOS 9:

O código muito padrão:

override func viewDidLoad() {
    super.viewDidLoad()

    // Dynamically create a search controller using anonymous function
    self.resultSearchController = ({
        let controller = UISearchController(searchResultsController: nil)
        controller.searchResultsUpdater = self
        controller.dimsBackgroundDuringPresentation = false

        controller.searchBar.sizeToFit()
        controller.searchBar.delegate = self

        self.tableView.tableHeaderView = controller.searchBar

        return controller
    })()

    // Auto sizing row & cell height
    self.tableView.estimatedRowHeight = 130
    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.definesPresentationContext = true

    // No footer for better presentation
    self.tableView.tableFooterView = UIView.init(frame: CGRectZero)
}

Esse problema também acontece no iOS 9.1 beta ...

Qualquer idéia / ponteiro seria profundamente apreciado

Felicidades.


Configurar o navigationBar permanentemente como translúcido em storyboard resolveu meu problema.


Descobri que são as métricas simuladas (barra superior) no storyboard que causam esse problema. No meu caso, as linhas a seguir funcionam, mas ainda não sei por quê.

- (void)willPresentSearchController:(UISearchController *)searchController {
    // do something before the search controller is presented
    self.navigationController.navigationBar.translucent = YES;
}

-(void)willDismissSearchController:(UISearchController *)searchController
{
    self.navigationController.navigationBar.translucent = NO;
}

Eu não tenho uma barra de navegação neste lugar de um aplicativo. Nenhum dos outros posts SO me ajudou, então eu consertei dessa forma:

- (void)layoutSubviews
{
    [[[self searchController] searchBar] sizeToFit];
}

Eu precisei

self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true

Eu encontrei uma pergunta semelhante here mas no meu caso não estava no método viewDidLoad. Eu tive que experimentar diferentes visões até que funcionasse. Agora eu posso ter uma cor de barra de navegação personalizada e a barra de pesquisa,


Funciona

override func viewDidLoad() {
    super.viewDidLoad()

    self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent
}

Não tenho certeza qual é exatamente o problema, mas eu o 'consertei' por:

self.searchController.hidesNavigationBarDuringPresentation = NO;
self.definesPresentationContext = NO;

Meu palpite é que o UISearchController está fazendo algo estranho quando está tentando se apresentar como uma barra de navegação. Então, isso é um hack, mas pelo menos não bloqueia o usuário. A barra de pesquisa não faz a animação legal e encobre a barra de navegação.


Obrigado @wiles duan e @Techprimate

No meu caso, consertei esse problema definindo:

self.definesPresentationContext = NO;

E implemente os 2 métodos a seguir em UISearchControllerDelegate

- (void)willPresentSearchController:(UISearchController *)searchController {
    // do something before the search controller is presented
    self.navigationController.navigationBar.translucent = YES;
}

-(void)willDismissSearchController:(UISearchController *)searchController
{
    self.navigationController.navigationBar.translucent = NO;
}

Parece que todos nós temos o mesmo problema, mas eles foram resolvidos de maneiras diferentes. No entanto, nenhuma das respostas sugeridas funcionou para mim :(. No entanto, agradeço a todos pelo seu tempo.

Eu tenho uma solução que resolveu o meu problema. Ele está definindo Extend Edges - Under Opaque Bars do meu (MyModalView: UITableViewController) como true no Storyboard usando o Interface Builder.

Em suma:

MyModalView: UITableViewController, no Storyboard usando o Interface Builder

Estender bordas: - Em Barras superiores marcadas - Em Barras inferiores marcadas - Em Barras opacas marcadas


sc.hidesNavigationBarDuringPresentation = false

faz o truque para mim

lazy var searchController:UISearchController = {
        let sc = UISearchController(searchResultsController: nil)
        sc.searchResultsUpdater = self
        sc.obscuresBackgroundDuringPresentation = false
        sc.searchBar.placeholder = "Search"
        sc.hidesNavigationBarDuringPresentation = false
        return sc
    }()