wake-up-neo.net

iOS 9 searchBar verschwindet aus der Tabellenkopfansicht, wenn UISearchController aktiv ist

Die Struktur:

View1 (Klick auf eine Schaltfläche) -> modal präsentieren (MyModalView: UITableViewController)

MyModalView verfügt über einen eingebetteten UISearchController. Die Suchleiste von UISearchController befindet sich in MyModalView.tableView.tableHeaderView.

Seit iOS 8.0 funktioniert das einwandfrei. Unter iOS 9 verschwindet die Suchleiste jedoch, wenn der UISearchController aktiv ist. Bitte schauen Sie sich diese Bilder unten an

Die modale Ansicht:  modal view

UISearchController aktiv auf iOS 8:  search bar in iOS 8

UISearchController aktiv auf iOS 9:  search bar in iOS 9

Der Standardcode:

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)
}

Dieses Problem tritt auch in der Beta von iOS 9.1 auf. 

Jede Idee/jeder Hinweis wird sehr geschätzt

Prost.

53
David Trang

Es scheint, dass wir alle das gleiche Problem hatten, aber sie wurden auf unterschiedliche Weise gelöst. Allerdings hat keine der vorgeschlagenen Antworten für mich funktioniert :(. Trotzdem vielen Dank für Ihre Zeit. 

Ich habe eine Lösung gefunden, die mein Problem gelöst hat. Die Option Kanten verlängern - Unter undurchsichtigen Balken (MyModalView: UITableViewController) wird im Storyboard mit Interface Builder auf true gesetzt. 

In Summe:

MyModalView: UITableViewController, das im Storyboard den Interface Builder hat

Kanten verlängern: - Unter den oberen Leisten wurde ein Häkchen gesetzt - Unter den unteren Leisten wurde angekreuzt

 screenshot

64
David Trang

Ich bin mir nicht sicher, was genau das Problem ist, aber ich habe es durch Folgendes behoben:

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

Meine Vermutung ist, dass UISearchController etwas unkonventionelles tut, wenn es versucht, sich als Navigationsleiste zu präsentieren. Dies ist also ein Hack, der den Benutzer jedoch zumindest nicht blockiert. Die Suchleiste macht keine coolen Animationen und verdeckt die Navigationsleiste.

66
Shwethascar

Ich habe festgestellt, dass die simulierten Metriken (obere Leiste) im Storyboard dieses Problem verursachen ... In meinem Fall funktionieren die folgenden Zeilen, aber ich weiß immer noch nicht, warum.

- (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;
}
36
wiles duan

Ich musste 

self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true

Ich habe eine ähnliche Frage hier gefunden - aber in meinem Fall war dies nicht die viewDidLoad-Methode. Ich musste verschiedene Ansichten ausprobieren, bis es funktionierte. Jetzt kann ich sowohl eine benutzerdefinierte Navigationsleistenfarbe als auch die Suchleiste haben.

19
jigzat

Danke @wiles duan und @Techprimate

In meinem Fall habe ich dieses Problem behoben, indem ich Folgendes eingestellt habe:

self.definesPresentationContext = NO;

Implementieren Sie die folgenden zwei Methoden in 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;
}
10
patrick kuang

Ich habe es in meinem Fall behoben, indem ich es entfernte 

definesPresentationContext = true 

Ich habe noch nicht getestet, ob es Nachteile gibt, wenn Sie das entfernen!

Ich hatte das gleiche Problem und als ich die Benutzeroberfläche von Xcode debuggte, stellte ich fest, dass die UISearchBar-Ansicht in eine andere Ansicht verschoben und die Breite auf Null gesetzt wurde.

Ich habe es behoben, indem ich die definesPresentationContext-Eigenschaft der UISearchController auf false und die true für die enthaltende UITableViewController gesetzt habe.

Ich habe nur eine Zeile zu Ihrer viewDidLoad() hinzugefügt.

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.definesPresentationContext = false    // Disable the presentation controller

        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    // This one remains the same

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

Ich habe keine Navigationsleiste an dieser Stelle einer App. Keiner der anderen SO Beiträge hat mir geholfen, also habe ich es so korrigiert:

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

Wenn Sie die Navigationsleiste im Storyboard dauerhaft auf durchscheinend setzen, wurde mein Problem gelöst. 

1
Per

Es klappt

override func viewDidLoad() {
    super.viewDidLoad()

    self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent
}
1
Victor Gomes
sc.hidesNavigationBarDuringPresentation = false

macht den Trick für mich

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

Wenn Sie Ihre Navigationsleiste ausblenden möchten und den Suchcontroller im Vollbildmodus anzeigen möchten, legen Sie Folgendes in Ihrer Navigationsleiste fest. Die Suchleiste wird nicht aufgehoben:

navigationController?.navigationBar.translucent = true
0
mike.tihonchik

Keiner von ihnen hat für mich gearbeitet, ich habe es mit diesem Hack behoben

func position(for bar: UIBarPositioning) -> UIBarPosition {
    if UIDevice.current.userInterfaceIdiom == .pad {
        return .top
    } else {
        if iOSVersion <= 9 {
            return .top
        }
        return .topAttached
    }


}
0
Elsammak