2017-11-24 5 views
4

Ich versuche, einen UISearchController zu einem UIViewController hinzuzufügen, der ein UITableView (und ein MKMapView auch, aber hoffentlich das ist nicht das Problem) enthält. Ich folgte Ray Wenderlich's tutorial, aber ich kann nicht das gleiche Ergebnis in Bezug auf das Verhalten erhalten.UISearchController wird nicht wie erwartet angezeigt

Hier ist mein viewDidLoad:

override func viewDidLoad() { 
     super.viewDidLoad() 

     // Setup the Search Controller 
     searchController.searchResultsUpdater = self 
     searchController.obscuresBackgroundDuringPresentation = false 
     searchController.searchBar.placeholder = NSLocalizedString("Search references by project, customer or city", comment: "") 
     if #available(iOS 11.0, *) { 
      navigationItem.searchController = searchController 
      navigationItem.hidesSearchBarWhenScrolling = true 
     } else { 
      tableView.tableHeaderView = searchController.searchBar 
     } 
     definesPresentationContext = true 

     self.modeSelector.layer.cornerRadius = 5.0 

     if let split = splitViewController { 
      let controllers = split.viewControllers 
      detailViewController = (controllers[controllers.count - 1] as! UINavigationController).topViewController as? ReferenceViewController 
     } 

     self.navigationItem.rightBarButtonItem?.isEnabled = false 
    } 

Beachten Sie, dass der #available Test in der Mitte ist, weil ich iOS 9.1 unterstützen muß auf.

Jetzt sehe ich mehrere Probleme:

  • Die Suchleiste erscheint sofort und ich kann es nicht durch Scrollen
  • verstecken Wenn ich die Suchleiste konzentrieren, wird die Spitze des Tableview nicht haften an der Unterseite des Navigationspunkt:

enter image description here

der einzige große Unterschied, den ich mit Ray Wenderlich das Beispielprojekt zu sehen ist, dass seit Ich habe mein Projekt mit XCode 9 erstellt, mein Storyboard verwendet keine oberen und unteren Layout-Guides, sondern sichere Bereiche. Ich weiß nicht, ob es relevant ist, aber das ist das Einzige, was ich sehe.

Irgendeine Idee was los ist und wie ich das beheben könnte?

+0

Klicken Sie auf Ihren View-Controller, dann deaktivieren Sie in KI die Option "Scroll View Insets anpassen". Hoffentlich hilft dies. –

+0

@DharmeshKheni Nein, es ändert nichts. Gleiches Verhalten. – Sebastien

+0

@matt Ändert auch nichts. – Sebastien

Antwort

1

Wenn Sie iOS bis 9.1 unterstützen müssen, verwenden Sie wahrscheinlich Emulator mit Version älter als 9.1. Daher hat "vielleicht" obscuresBackgroundDuringPresentation keinen Einfluss auf die searchController ordnungsgemäß, da es nur auf iOS 9.1 oder neuer verfügbar ist. In dimsBackgroundDuringPresentation zur Unterstützung von bis zu 9.1:

if #available(iOS 9.1, *) { 
    searchController?.obscuresBackgroundDuringPresentation = false 
} else { 
    searchController?.dimsBackgroundDuringPresentation = false 
} 

Wenn dies nicht wie erwartet Hilfe angezeigt werden, habe ich fast sicher bin, dass das Problem über Ihre Layoutbeschränkungen ist. Bitte fügen Sie Ihre aktuellen Einschränkungen hinzu, wenn Sie Ihr Layout nicht in den sicheren Bereich bringen konnten.

+0

Diese "wenn verfügbar" hat nichts geändert, aber ich habe mir die Einschränkungen angeschaut und ich habe etwas Seltsames in IB gefunden: Die obere Einschränkung meiner Tabelle war wie folgt: - Tabelle View.Top Equal Superview.Top - konstante: 0 Wenn ich ändern, um dies zu: - Tisch View.Top Equal Sicher Area.Top - konstante: 0 Es scheint mir das erwartete Layout zu geben, wenn auch auf iOS-11, wenn ich die Suchleiste aktivieren In der Tabellenansicht wird darauf gewartet, dass das Ende der Suchleistenanimation an die richtige Position wechselt. Aber das ist gut genug. Jetzt muss ich nur herausfinden, warum die Suchleiste standardmäßig erscheint. – Sebastien

+1

Das Hinzufügen der Einschränkung "Oben ausrichten an: Safe Area - Constant = 0" an Ihre Tabelle bewirkt in diesem Fall sicher Wunder. :) Was willst du als nächstes? Wenn Sie das Problem immer noch nicht lösen können, können Sie weitere Screenshots bereitstellen, um Ihren aktuellen Fortschritt zu zeigen? –

+1

Ich wechselte schließlich zur tableHeaderView-Strategie, da ich für die gleichen Daten in diesem Controller zwischen einer Tabelle und einer Kartenansicht wechseln möchte, und ich möchte die Suchleiste nicht im Kartenmodus anzeigen. Mit diesem und dem Layout, das auf den sicheren Bereich ausgerichtet ist, habe ich immer noch einen kleinen Fehler auf dem iPhone X, aber keiner meiner Kunden hat das, also ist es in Ordnung. – Sebastien

3

verwenden diese unter Codezeile in Ihrem viewDidload

self.navigationController?.navigationBar.isTranslucent = false 

Hope this Sie

+0

Danke. In iOS 11 befindet sich der obere Teil der Tabellenansicht nun am unteren Rand der Navigationsleiste. Aber die Suchleiste wird immer noch standardmäßig angezeigt und bleibt beim Scrollen dort. – Sebastien

+0

Plus, wenn ich das tue, dann verschraubt es alle anderen View-Controller, die ich danach drücke. – Sebastien

+0

für verbleibenden Viewcontroller 'self.navigationController? .navigationBar.isTranslucent = true' Verwendung –

0

helfen Wenn Sie Xcode 9 (ios 11) verwenden. Dann ist das, was Sie wirklich tun wollen - Verwenden Sie die neuen Broader-Navigationsleisten, die die neuen Highlights in den IOS 11-Geräten sind. Aber da es viele gibt, die nicht auf ios-11 umgestiegen sind, werden auch ältere Geräte berücksichtigt. Für das Hinzufügen der Suchleiste zu den neueren Navigationsleisten habe ich die folgende Funktion verwendet, die eine Suchleiste beim Scrollen bietet und sie verbirgt, wenn der Benutzer die Seite scrollt.

func addSearchBar() { 
if #available(iOS 11.0, *) { 
    let sc = UISearchController(searchResultsController: nil) 
    sc.delegate = self 
    let scb = sc.searchBar 
    scb.tintColor = UIColor.white 
    scb.barTintColor = UIColor.white 
    //Change the colors as you like them 
    if let textfield = scb.value(forKey: "searchField") as? UITextField { 
    textfield.textColor = UIColor.blue 
    if let backgroundview = textfield.subviews.first { 

     // Background color 
     backgroundview.backgroundColor = UIColor.white 

     // Rounded corner 
     backgroundview.layer.cornerRadius = 10; 
     backgroundview.clipsToBounds = true; 
    } 
    } 

    if let navigationbar = self.navigationController?.navigationBar { 
    navigationbar.barTintColor = UIColor.white 
    } 
    navigationItem.searchController = sc 
    navigationItem.hidesSearchBarWhenScrolling = true 
}else{ 
//add the logic for previous version devices here. 
} 

Ich habe setzen auch die self.navigationController?.navigationBar.prefersLargeTitles = true; in viewDidLoad, da es ein Fehler in xcode9 ist und es aus dem Interface Builder Einstellung nicht funktioniert (noch) nicht.

Die folgende Methode wurde von here

0

genommen worden Ich denke, dass ist dein Abschnitt Header, der nach oben leer angezeigt wird. Versuchen Sie, heightForHeaderInSection auf 0 zu setzen und geben Sie nil für den viewForHeaderInSection-Wert zurück.

+0

Nein, ich habe nur diese 2 hinzugefügt, und das Ergebnis ist genau das gleiche wie zuvor. – Sebastien

Verwandte Themen