当UISearchController被解雇时屏幕滞后

时间:2017-02-09 21:29:30

标签: ios uitableview uiviewcontroller swift3 uisearchcontroller

预期:

点击UIButton时,以模态方式显示一个具有搜索控制器和带有结果的tableview的viewcontroller。

点击列表中的某个项目时,将搜索栏的文本更改为已点击的内容,并将视图控制器关闭回原始状态,并将UIButton现在设置为该文本。

实际

UIButton将一个segue调用到searchViewController。 searchViewController显示,并正确配置searchController和tableView。 点击一个单元格调用退出segue,退出原始屏幕并正确更新UIButton和搜索栏中的文本......

但是,一个令人毛骨悚然的白色屏幕落在了放松的区域,它让我疯狂。

尝试了缓解措施:

  1. 重新调用searchController,然后调用segue 编程
  2. 在didSelectRowAt中调用self.dismiss(animated:true completion:nil)
  3. 将dismiss置于主线程上:DispatchQueue.main.async {}
  4. 调用self.presentingViewController?.dismiss(animated:true)
  5.   

    视频 Demo of flashing

    代码:

    SearchDetailsViewController - 要放松的Viewcontroller

    import UIKit
    
    class SearchDetailsViewController: UIViewController {
    
      @IBOutlet weak var destinationButton: UIButton!
      override func viewDidLoad() {
        super.viewDidLoad()
      }
    
      override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    
        if searchDestination != "" {
            destinationButton.setTitle(searchDestination, for: UIControlState.normal)
            destinationButton.setTitleColor(UIColor.black, for: UIControlState.normal)
        } else {
            destinationButton.setTitle("Search Nearby", for: UIControlState.normal)
        }
      }
    
      @IBAction func unwindToSearchDetailsViewController(segue: UIStoryboardSegue){
      }
    }
    

    SearchViewController - 问题孩子。我目前将tableview单元格作为故事板中的退出segue。

        class SearchViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating, UISearchBarDelegate, UISearchControllerDelegate {
    
    
        @IBOutlet weak var searchResultsTableView: UITableView!
    
        var destinationsObj:[String:[String]] = [:]
        var destinations:[String] = []
        var defaultDestinations:[String] = ["Search Nearby"]
        var filteredDestinations:[String] = ["Search Nearby"]
        var shouldShowSearchResults = false
    
        var searchActive:Bool = false
        var searchController: UISearchController!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            defaultDestinations = recentSearches
            configureTableView()
            configureSearchController()
    
        }
    
        override func viewDidAppear(_ animated: Bool) {
            // Show search bar keyboard
            searchController.isActive = true
            DispatchQueue.main.async {
                self.searchController.searchBar.becomeFirstResponder()
            }
    
        }
    
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
        // MARK: Configure Functions
        func configureSearchController() {
            searchController = UISearchController(searchResultsController: nil) //nil lets the view controller also be the search results
            searchController.searchResultsUpdater = self
            searchController.dimsBackgroundDuringPresentation = false
    
            searchController.searchBar.placeholder = "Where to?"
            searchController.searchBar.delegate = self
    
            searchController.searchBar.sizeToFit()
            searchResultsTableView.tableHeaderView = searchController.searchBar
            searchController.delegate = self
    
        }
    
        func configureTableView() {
            searchResultsTableView.delegate = self
            searchResultsTableView.dataSource = self
    
            //searchResultsTableView.isMultipleTouchEnabled = false
        }
    
        // MARK: TableView Delegate Functions
        func numberOfSections(in tableView: UITableView) -> Int {
            return 1
        }
    
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    
            if shouldShowSearchResults {
                return filteredDestinations.count
            } else {
                return defaultDestinations.count
            }
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "idCell", for: indexPath)
    
            if shouldShowSearchResults {
                cell.textLabel?.text = filteredDestinations[indexPath.row]
            } else {
    
                cell.textLabel?.text = defaultDestinations[indexPath.row]
            }
    
            return cell
        }
    
        func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
            return 40.0
        }
    
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
    
            if let value = tableView.cellForRow(at: indexPath)?.textLabel?.text {
                self.searchController.searchBar.text = value
                searchDestination = value
                if !recentSearches.contains(value) {
                    recentSearches.append(value)
                }
    
            }
            //self.searchController.resignFirstResponder()
    //        tableView.deselectRow(at: indexPath, animated: false)
    //        DispatchQueue.main.async {
    //            self.dismiss(animated: true, completion: nil)
    //        }
    
           // self.performSegue(withIdentifier: "cancelSearchSegue", sender: self)
        }
    
        // MARK: UISearchBar Delegate Functions
        func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
            searchBar.resignFirstResponder()
            //self.dismiss(animated: true, completion: nil)
            self.performSegue(withIdentifier: "cancelSearchSegue", sender: self)
        }
    
        func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    
            if let value = searchBar.text {
                searchDestination = value
                if !recentSearches.contains(value) {
                    recentSearches.append(value)
                }
            }
    
    
            //self.dismiss(animated: true, completion: nil)
            self.performSegue(withIdentifier: "cancelSearchSegue", sender: self)
        }
    
        func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
    
        }
    
    
        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            shouldShowSearchResults = true
            if searchText.characters.count > 1 {
                return
            } else {
                if let firstLetter = searchText.characters.first{
                    print("Typed \(firstLetter)")
                    getPredictionData(firstLetter:firstLetter.description)
                }
            }
        }
    
        func dismissCurrentView() {
           // self.presentingViewController?.dismiss(animated: true, completion: nil)
            self.performSegue(withIdentifier: "cancelSearchSegue", sender: self)
        }
    

    Screenshot of my storyboard

2 个答案:

答案 0 :(得分:0)

好吧,我以为我发布了答案,这种情况发生在其他任何人身上。

在ViewDidAppear中,我将searchController设置为活动状态     searchController.isActive = true

在我解雇之前,我需要将其设置为无效!

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  if let value = tableView.cellForRow(at: indexPath)?.textLabel?.text {
    self.searchController.searchBar.text = value
    searchDestination = value
    if !recentSearches.contains(value) {
        recentSearches.append(value)
    }
  }
 self.searchController.isActive = false
 self.performSegue(withIdentifier: "cancelSearchSegue", sender: self)
}

答案 1 :(得分:0)

不要执行segue,尝试直接关闭视图控制器并在解除之前设置将视图控制器呈现给搜索结果的属性