Swift - UISearchBar сообщение об ошибке не появляется, когда нет данных - PullRequest
1 голос
/ 07 ноября 2019

У меня есть UISearchBar фильтр, который работает хорошо и находит данные в моем UITableView правильно из моей CoreData базы данных.

Он также отображается правильно, когда не находит соответствующий текст, а затем исчезает при совпадении и отображает данные.

Моя проблема заключается в том, что сообщение об отсутствии результата отображается при отсутствииданные в табличном представлении.

Я знаю причину проблемы, поскольку мой код не возвращает сообщение, когда счетчик больше 0 и поскольку в таблице нет данных, он определенно покажет сообщениено я не знаю, как решить эту проблему.

Может ли кто-нибудь подсказать мне, как будет получено сообщение без результата only сразу после поиска текста, а затем исчезнет, ​​когда строка поиска не будетиспользовать?

Я также проверил множество связанных вопросов по переполнению стека, но ни один из них не помог мне.

Снимок экрана

Изображение проблемы

Как вы можете видеть, оно показывает сообщение без использования даже UISearchBar .

Код

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    if coreDataVariable.count > 0 {
        self.tableView.backgroundView = nil
        self.tableView.separatorStyle = .singleLine
        return 1
    }

    let rect = CGRect(x: 0,
                      y: 0,
                      width: self.tableView.bounds.size.width,
                      height: self.tableView.bounds.size.height)
    let noDataLabel: UILabel = UILabel(frame: rect)

    noDataLabel.numberOfLines = 0
    noDataLabel.text = "Query not found.\n\nPlease check your search."
    noDataLabel.textAlignment = NSTextAlignment.center
    self.tableView.backgroundView = noDataLabel
    self.tableView.separatorStyle = .none

    return coreDataVariable.count
}

Вот моя функция панели поиска

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

    if !searchText.isEmpty
    {
        var predicate: NSPredicate = NSPredicate()

        predicate = NSPredicate(format: "attriubteName1 contains[c] '\(searchText)' OR attriubteName2 contains[c] '\(searchText)'")
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
        let managedObjectContext = appDelegate.persistentContainer.viewContext
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "EntityName")
        fetchRequest.predicate = predicate
        do
        {
            coreDataVariable = try managedObjectContext.fetch(fetchRequest) as! [NSManagedObject] as! [ObjectName]
        }
        catch let error as NSError
        {
            let alert = UIAlertController(title: "Cannot Search Data", message: "Error searching saved data. Please reinstall ObjectName Saver if problem persists.", preferredStyle: UIAlertController.Style.alert)

            let okAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.cancel)
            {
                UIAlertAction in
                alert.removeFromParent()
            }
            alert.addAction(okAction)

            self.present(alert, animated: true, completion: nil)

            print("Could not fetch. \(error)")
        }
    }
    else
    {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
        let managedObjectContext = appDelegate.persistentContainer.viewContext
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "ObjectName")
        do
        {
            coreDataVariable = try managedObjectContext.fetch(fetchRequest) as! [ObjectName]
        }
        catch
        {
            let alert = UIAlertController(title: "Cannot Load Data", message: "Error loading saved data. Please app if problem persists.", preferredStyle: UIAlertController.Style.alert)

            let okAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.cancel) {
                UIAlertAction in
                alert.removeFromParent()
            }
            alert.addAction(okAction)

            self.present(alert, animated: true, completion: nil)

            print("Error loading data")
        }

    }
    table.reloadData()
}

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Простая логика может быть интегрирована здесь в соответствии с вашей проблемой

var isSearchActive = false // bool variable

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
{
  if self.searchBar.text == ""
  {
        isSearchActive = false 
       //--               
  }
  else
   {
        isSearchActive = true
   }

    self.tableView.reloadData()
  }

 //logic  this  data source method
 func numberOfSections(in tableView: UITableView) -> Int
 {
 if coreDataVariable.count > 0 {
   self.tableView.backgroundView = nil
   self.tableView.separatorStyle = .singleLine
    return 1
 }
 else 
 { 
    if isSearchActive == true
    {
       // -- Make UIlabel here
    }
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection  section: Int) -> Int
{
return coreDataVariable.count
}
0 голосов
/ 07 ноября 2019

Кажется, ваш coreDataVariable.count равен 0, когда нет данных. Следовательно, нет строки, и ваша метка показывает, что сказано: «Запрос не найден. \ N \ nПроверьте поиск». Я считаю, что coreDataVariable содержит все данные перед поиском. Вам также нужно несколько отсортированных отфильтрованных данных

Не видя в вашем коде searchBar:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    if searchController.isActive &&  searchController.searchBar.text != ""{
        // check your filtered data count here and if it is 0, show your label
        // Do the logic and find how many rows you need
    }
}

Правило, когда для tableView есть SearchBar, тогда NumberOfSection, NumebrOfRow, CellForRow необходимо:

if searchController.isActive &&  searchController.searchBar.text != ""{
        //Your logic here
}

ОБНОВЛЕНИЕ Ноябрь 7,2019: где-то в коде определите это

let searchController = UISearchController(searchResultsController: nil)

, убедитесь, что ваш класс соответствует UISearchResultsUpdating и UISearchBarDelegate Также этот может помочь https://stackoverflow.com/a/28997222/1200543

...