Не работает клавиатура в SearchBar

searchbar

#1

помогите разобраться, есть вроде не очень сложный код, но почему-то при установке курсора в поисковую строку не появляется клавиатура, ни автоматически, ни через Command+K. Невозможно что-то ввести и с физической клавы. Более того, при попытке нажать любую клавишу, проект просто зависает и больше ни на что не реагирует. Сообщений об ошибках нет, приложение не падает.

import UIKit

class MasterTableViewController: UITableViewController {
    
    var months = [String]()    
    let searchController = UISearchController(searchResultsController: nil)
    var filteredMonths: [String] = []
    


    override func viewDidLoad() {
        super.viewDidLoad()        
        months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
 
        searchController.searchResultsUpdater = self      
        searchController.obscuresBackgroundDuringPresentation = false       
        searchController.searchBar.placeholder = "Search Month"   
        navigationItem.searchController = searchController    
        definesPresentationContext = true
    }

    // MARK: - Table view data source

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        if isFiltering {
            filteredMonths.count
        }
        return months.count
    }
   
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)        
        
        let month: String
        
        if isFiltering {
            month = filteredMonths[indexPath.row]
        } else {
            month = months[indexPath.row]
        }
        
        cell.textLabel?.text = month

        return cell
    }
    
    var isSearchBarEmpty: Bool {
      return searchController.searchBar.text?.isEmpty ?? true
    }

    var isFiltering: Bool {
      return searchController.isActive && !isSearchBarEmpty
    }
    
    func filterContentForSearchText(_ searchText: String) {
      
        filteredMonths = months.filter { (month: String) -> Bool in
        return month.lowercased().contains(searchText.lowercased())
      }

      tableView.reloadData()
    }

}

extension MasterTableViewController: UISearchResultsUpdating {
  
    func updateSearchResults(for searchController: UISearchController) {
       
    let searchBar = searchController.searchBar
    filterContentForSearchText(searchBar.text!)
  }
}

Пдозреваю, что проблема где-то в методе filterContentForSearchText, но неясно что именно.


#2

Посмотрите как делается фильтрация из поиска с задержкой, после того как закончили вводить текст. У вас просто подвисает фильтрация.


#3

вы не поверите, как это разрешилось, немного мистики и танцы с бубнами. В двух словах, может кому-то пригодится. Вначале начали зависать и несколько других приложений с поиском, намекая, что это не код, а какой-то общий глюк. По ходу Xcode пару раз упал, после чего данная проблема ушла. Но появилась другая, стало падать само приложение выдавая сообщение out of range. И упорно не хотел уходить warning вот из этой строки:

if isFiltering {
            filteredMonths.count
}

Warning сообщал, что результат этой строки не используется. В итоге, удалил и заново набрал весь этот блок, после чего все стало нормально работать.


#4

Это больше похоже на случайное совпадение, потому что варнинг правильно предупреждал и смысла от этих строк нет, если сам каунт ни как не использовать. Скорее всего решилось или временно или по другой причине.


#5

возможно, отсюда и появилось слово “мистика”, потому как непонятно было что там происходило. А каунт нужен был и так уже пару раз случалось раньше и на разных компах, что код почему-то не работал, пока его не удалить и не набрать заново.