2016-10-31 4 views
0

Hier geladen wird, ist meiner Ansicht nach mit UISearchBar in meinem navigationbar:meine UISearchBar Lassen Sie automatisch erhalten konzentrieren, wenn die Ansicht

enter image description here

ich es automatisch erhalten möchten fokussiert, wenn meine Ansicht geladen wird. Ich habe versucht, einige Möglichkeiten basierend auf this question. Aber keiner funktioniert. Ich muss auf den Suchbalken klicken, um ihn zu fokussieren.

enter image description here

Dies ist einer meiner Code:

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    self.searchController.isActive = true 

    DispatchQueue.main.async { [unowned self] in 
     self.searchController.searchBar.becomeFirstResponder() 
    } 
} 

Jemand der searchController erwähnt sollte nach becomeFirstResponder aktiv sein. Ich habe es versucht:

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    DispatchQueue.main.async { [unowned self] in 
     self.searchController.searchBar.becomeFirstResponder() 
     self.searchController.isActive = true 
    } 
} 

Das Keyboard kam diesmal heraus. Aber ich kann nichts in meine Suchleiste eingeben.

Irgendeine Idee? Vielen Dank.

+0

Haben Sie versucht, es ohne Debugger auszuführen? –

+0

ist Ihre Suchleiste in der Navigationsleiste? –

+0

Haben Sie es am Gerät getestet? Manchmal auf dem Simulator ist die Tastatur versteckt von CMD + K – kamwysoc

Antwort

0

Ich könnte die Suchleiste fokussieren, wenn sie mit dem folgenden Code angezeigt wird. Hoffe, wenn geholfen würde.

Und ich habe verglichen Aufruf der Ersthelfer innerhalb viewWillAppear und viewDidAppear, es funktioniert nur, wenn Sie es innerhalb viewWillAppear aufrufen. Aber ich verstehe nicht ganz, warum das passiert ist. Das ist vielleicht der Grund, warum Sie nichts in Ihre Suchleiste eingeben können.

PS: Ich denke, Ihre DispatchQueue.main.async ist nicht notwendig in viewDidAppear. Es wird immer in der Hauptwarteschlange aufgerufen.

// 
// TestSearchbarFocus.swift 
// SwiftPlayground 
// 
// Created by Enix Yu on 31/10/2016. 
// Copyright © 2016 RobotBros. All rights reserved. 
// 

import UIKit 


class TestSearchbarFocus: UITableViewController, UISearchResultsUpdating { 

    var searchController : UISearchController! 

    let data = ["ABC", "BBC", "CCD", "Enix", "Peter", "Earth"] 
    var displayData = [String]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     searchController = UISearchController(searchResultsController: nil) 
     searchController.searchResultsUpdater = self 
     searchController.dimsBackgroundDuringPresentation = false 
     searchController.hidesNavigationBarDuringPresentation = false 
     definesPresentationContext = true 
     navigationItem.titleView = searchController.searchBar 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 

     searchController.active = true 
     searchController.searchBar.becomeFirstResponder() 
    } 

    func filterDataForSearchText(text: String){ 
     displayData = data.filter({ 
      (item) -> Bool in 
      item.lowercaseString.containsString(text.lowercaseString) 
     }) 

     tableView.reloadData() 
    } 

    func updateSearchResultsForSearchController(searchController: UISearchController) { 
     filterDataForSearchText(searchController.searchBar.text!) 
    } 

    // MARK : UITableViewDataSource/Delegate 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if searchController.active && searchController.searchBar.text != "" { 
      return displayData.count 
     } 

     return data.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) 
     if searchController.active && searchController.searchBar.text != "" { 
      cell.textLabel?.text = displayData[indexPath.row] 
     } else { 
      cell.textLabel?.text = data[indexPath.row] 
     } 
     return cell 
    } 
} 

PS: Ich bin mit schnellen 2 + Xcode 7.3.1

+0

Leider funktioniert es in meinem Fall nicht. Ich weiß nicht warum. –

+0

haben Sie versucht, den Code in 'viewWillAppear' zu verschieben. – Enix

+0

Ja. Funktioniert immer noch nicht. Ich kenne das Problem jetzt. Weil mein View-Controller nicht der Root-View-Controller ist. Es wird vom Root View Controller gepusht. Aber ich weiß nicht, wie ich das beheben soll. –

0

folge ich den Vorschlag, und mein Projekt neu erstellen. Es funktioniert dann. Mein Code:

class SearchViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating, UISearchControllerDelegate, UISearchBarDelegate { 

...... 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    searchController.isActive = true 
} 

func didPresentSearchController(_ searchController: UISearchController) { 
    DispatchQueue.main.async { [unowned self] in 
     self.searchController.searchBar.becomeFirstResponder() 
    } 
} 

Hat becomeFirstRespnder in Haupt Warteschlange einzureihen, da sonst die Tastatur wird nicht automatisch angezeigt.

Verwandte Themen