2016-10-31 2 views
0

를로드 할 때 내 UISearchBar 자동으로 초점을하자 :뷰가 내 내비게이션 바에서 UISearchBar 내이다 여기에

enter image description here

내가 내보기를로드 할 때 자동으로 초점을 맞춘 얻을합니다. 나는 this question을 기반으로 몇 가지 방법을 시도했다. 하지만 아무도 작동하지 않습니다. 검색 창을 클릭하여 초점을 맞추어야합니다.

enter image description here

이 내 코드 중 하나입니다

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

    self.searchController.isActive = true 

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

누군가가 searchController이 becomeFirstResponder 후 활성화되어야 언급했다. 나는 이것을 시도했다 :

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

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

이번에는 keybord가 나왔다. 하지만 검색 창에서 아무 것도 입력 할 수 없습니다.

아이디어가 있으십니까? 감사.

+0

디버거없이 실행 해 보셨습니까? –

+0

이 탐색 모음의 검색 표시 줄입니까? –

+0

기기에서 테스트 했습니까? 가끔 시뮬레이터에서 키보드가 CMD + K – kamwysoc

답변

0

다음 코드가 표시 될 때마다 검색 창에 집중할 수 있습니다. 희망이 있다면 도움이 될 것입니다.

그리고 viewWillAppearviewDidAppear 안에있는 첫 번째 응답자가되는 것을 비교했을 때, 내 컴퓨터를 viewWillAppear이라고 할 때만 작동했습니다. 그러나 나는 왜 이런 일이 일어 났는지 이해하지 못합니다. 아마도 검색 창에 아무 것도 입력 할 수없는 이유 일 수 있습니다.

추신 : 귀하의 DispatchQueue.main.asyncviewDidAppear 안에 필요하지 않습니다. 메인 큐에서 항상 호출됩니다.

// 
// 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 : 내가 사용하고 신속한 2 + 엑스 코드는 7.3.1

+0

불행히도 그것은 내 경우에는 작동하지 않습니다. 이유를 모르겠다. –

+0

'viewWillAppear' 안에 코드를 옮기려고 했습니까? – Enix

+0

예. 그래도 작동이 안되는. 지금 문제를 알고 있습니다. 내보기 컨트롤러가 루트보기 컨트롤러가 아니기 때문입니다. 루트 뷰 컨트롤러에 의해 푸시됩니다. 그러나 나는 그것을 고치는 법을 모른다. –

0

나는 제안을 따라 내 프로젝트를 다시 작성하십시오. 그것은 그 때 작동합니다. 내 코드 :

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

그렇지 않으면 키보드가 자동으로 표시되지 않습니다, 주요 큐에 becomeFirstRespnder을 넣어 가지고 있습니다.