2015-06-28 4 views
7

Ich habe einen UISearchController in einem Tabellenansicht-Controller erstellt. Ich übergehe diesen Tabellenansicht-Controller mit einem Push-Übergang von einem anderen View-Controller. Ich möchte, dass die Tastatur mit dem Cursor in der Suchleiste angezeigt wird, sobald der Tabellenansicht-Controller gedrückt wird.Tastatur automatisch anzeigen, wenn UISearchController geladen wird

machte ich die Suchsteuerung aktiv in der viewDidLoad Methode

self.mySearchController.active = true 

Es macht die Suchsteuerung aktiv, aber dies nicht bringt die Tastatur noch ist der Cursor in der Suchleiste platziert werden. Ich versuchte auch

self.mySearchController.searchBar.becomeFirstResponder() 

Diese Linie scheint keine Wirkung zu haben.

Wie rufe ich die Tastatur automatisch/programmgesteuert auf? Im Folgenden finden Sie eine ausführlichere Version von meinem Code

class PickAddressViewController: UITableViewController, UISearchResultsUpdating { 

var searchText = "" 

var mySearchController = UISearchController() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.mySearchController = ({ 
     let controller = UISearchController(searchResultsController: nil) 
     controller.searchResultsUpdater = self 
     controller.dimsBackgroundDuringPresentation = false 
     controller.searchBar.sizeToFit() 
     controller.searchBar.text = self.searchText 

     self.tableView.tableHeaderView = controller.searchBar 

     return controller 
    })() 

    self.mySearchController.active = true 
    self.mySearchController.searchBar.becomeFirstResponder() 
} 

Antwort

3

becomeFirstResponder ist der Weg zu gehen, aber man sollte es nicht in viewDidLoad tun. Sehen Sie folgende Diskussion für Details - Cannot set searchBar as firstResponder

+4

Great! Ich habe versucht, die Lösung in diesem Link und es funktioniert! Für andere Neulinge wie mich, zusätzlich zu dem Code, den ich in meiner Frage geschrieben habe, müssen Sie Folgendes tun: Machen Sie den View-Controller zu einem UISearchControllerDelegate. Schreiben Sie beim Definieren des Suchcontrollers eine Zeile mit der Bezeichnung controller.delegate = self. Setzen Sie die Zeile 'anotherFressponder' in die Delegate-Funktion 'didPresentSearchController' – RookiePro

2

Ich habe auch die Vorschläge in den Link von Nikita Leonov erwähnt. Ich musste hinzufügen, machen die Klasse ein UISearchControllerDelegate & UISearchBarDelegate und dann hat es funktioniert. Ich mache u nicht

class PickAddressViewController: UITableViewController, UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.mySearchController = ({ 
      controller.searchBar.delegate = self 
     })() 

     self.mySearchController.active = true 
     self.mySearchController.delegate = self 
    } 

    func didPresentSearchController(searchController: UISearchController) { 
     self.mySearchController.searchBar.becomeFirstResponder() 
    } 
    … 
} 
0

Neben tun, was die anderen Nutzern vorgeschlagen, ich habe auch die folgenden, und es funktionierte:

searchController.definesPresentationContext = true

2
override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(true) 
    self.navigationItem.titleView = searchController!.searchBar 
    dispatch_async(dispatch_get_main_queue(), { 
     self.searchController?.active = true 
     self.searchController!.searchBar.becomeFirstResponder() 
    }) 
} 

und dieser Code

func presentSearchController(searchController: UISearchController) { 
    searchController.searchBar.becomeFirstResponder() 
} 

stellen Sie sicher, geben Sie searchController?.delegate = self in ViewDidLoad(). Getestet auf iOS 9. * Gerät

0

Swift 3 Lösung in meinem Fall:

override func viewDidLoad() { 
    super.viewDidLoad() 
    navigationItem.titleView = mySearchController.searchBar 
    mySearchController.searchResultsUpdater = self 
    mySearchController.delegate = self 

} 

override func viewDidAppear(_ animated: Bool) { 
    DispatchQueue.main.async { 
     self.mySearchController.isActive = true 
    } 
} 

func presentSearchController(_ searchController: UISearchController) { 
    mySearchController.searchBar.becomeFirstResponder() 
}