#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 данные по искомому имени не поступают