этот класс не совместим с кодированием ключевых значений для имени ключа или любых значений, которые я даю в своем коде

#ios #swift #iphone #xcode #searchbar

#iOS #swift #iPhone #xcode #панель поиска

Вопрос:

Я пытаюсь использовать текстовое поле в качестве панели поиска. Я добавил все методы delagate. Но когда я начинаю вводить любую букву в своем текстовом поле, происходит сбой, подобный :

этот класс не совместим с кодированием ключевого значения для имени ключа.

Мой объект содержит (то есть, который я пытаюсь заполнить данными в моем представлении tabke)

 {
"lo_name" = "yourData"
}
  

Мой код:

  func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
    {
        if string.isEmpty
        {
            search = String(search.characters.dropLast())
        }
        else
        {
            search=textField.text! string
        }

        print(search)
        let predicate=NSPredicate(format: "SELF.lo_name CONTAINS[cd] %@", search)
        let arr=(objectArray as NSArray).filtered(using: predicate)

        if arr.count > 0
        {
            SearchedobjectArray.removeAll(keepingCapacity: true)
            SearchedobjectArray = arr as! [MyLooVC.Objects]
        }
        else
        {
            SearchedobjectArray=objectArray
        }
        looTable.reloadData()
        return true
    }
  

я попытался указать, как показано ниже :

 1.let predicate=NSPredicate(format: "SELF.loo_name CONTAINS[cd] %@", search)

2.let predicate=NSPredicate(format: "SELF.name CONTAINS[cd] %@", search)
  

Но ничего не добивается успеха. Все тот же сбой. Есть решение?

Спасибо

Комментарии:

1. Проблема в name свойстве. Возможно, вы подключили выход какого-либо текстового поля к name, которое отключено от раскадровки. Попробуйте удалить и повторно подключить name розетку, это решит вашу проблему.

2. Нет, это также приводит к сбою, как this class is not key value coding-compliant for the key name. и this class is not key value coding-compliant for the key lo_name. тоже?. И у меня нет выхода, подобного `name`

Ответ №1:

Я рассматриваю ваш массив данных как:

 [
 {
  "lo_name" = "yourData1"
 },
 {
  "lo_name" = "yourData2"
 }
]
  

Вам следует использовать swift type array, а не NSArray , поэтому ваш objectArray будет выглядеть:

     let objectArray: [[String: Any]]? 
    let objectArray: [[String: String]]? // if all values are string type
  

И вы должны отфильтровать массив следующим образом:

     let arr = objectArray?.filter({ ($0["lo_name"] as? String)?.contains(search) ?? false })

    let arr = objectArray?.filter({ $0["lo_name"]?.contains(search) ?? false }) // It all values in dictionary are string type
  

Для Struct Array:

     struct Objects { 
        var looId : String?
        var looName : String?
    }
    let objectArray = [Objects]()
    // filter it like
    let arr = objectArray.filter({ $0.looName?.contains(search) ?? false })
  

Комментарии:

1. извините за позднее обновление. Мой objectArray выглядит как var objectArray = [Objects]() и лежит struct Objects { var looId : String! var looName : String }

2. Итак, вам нужно фильтровать по Object.lo_name свойству?

3. затем сделайте это следующим образом objectArray.filter({ $0.looName?.contains(search) ?? false })

4. я попробовал этот код let arr = objectArray.filter({ $0.looName.contains(search) }) print(arr) if arr.count > 0 { SearchedobjectArray.removeAll(keepingCapacity: true) SearchedobjectArray = arr } else { SearchedobjectArray=objectArray }

5. но все же я не смог выполнить поиск… если я введу другое имя .. все равно мои данные будут в моей таблице view…my данные по искомому имени не поступают