#ios #swift #core-data #tableview
#iOS #swift #core-data #просмотр таблицы
Вопрос:
У меня есть TableView с двумя столбцами — name и value, где name — это само имя атрибута для экземпляра класса объекта из CoreData. А значение — это текстовое поле, которое является значением или этим атрибутом, и я хочу, чтобы пользователь мог редактировать его в tableview.
У меня есть имена свойств и отдельно значения, каждое из которых хранится в отдельном массиве. Итак, у меня есть propertyArray и valueArray, и порядок массивов соответствует парам ключей.
Таким образом, я, безусловно, могу определить, какое свойство редактируется на основе indexPath , но у меня возникли проблемы с выяснением, как изменить фактическое значение свойства на то, что недавно введено в текстовое поле.
Логика в том, что мне нужно :
animal.(propertyArray[IndexPath.row]) = textField.text
есть ли у меня способ создать строковую переменную «animal.whateverTheAttributeIs» и каким-то образом преобразовать ее в левую часть этого уравнения?
Комментарии:
1. Я предполагаю, что у вас есть только один экземпляр объекта core data в вашем табличном представлении, а затем x количество атрибутов, то есть строк, для этого экземпляра?
2. да, это совершенно верно.
3. Затем у вас есть атрибуты в определенном порядке, поэтому вам следует создать простое сопоставление между номером строки и свойством.
4. да, у меня данные упорядочены правильно. Я не знаю о сопоставлении, так что это то, что я могу исследовать. Я могу получить доступ ко всем отдельным точкам данных, которые мне нужны для формирования уравнения настройки animal.property но как мне указать animal.x = «Spot» или animal.x = «Male», где x изменяется от строки к строке? У меня есть буквальное строковое представление x, но я не знаю, как включить это в само уравнение, чтобы установить новое значение свойства.
5. Используйте
setValue:forKeyPath:
.
Ответ №1:
У вас может быть словарь, который содержит сопоставление между номерами строк и свойствами, используя keyPath
struct Example {
var id: String
var name: String
var text: String
}
let rowMap: [Int: WritableKeyPath<Test, String>] = [0: .id, 1: .name, 2: .text]
а затем вы просматриваете словарь, чтобы получить правильный путь к ключу из строки
if let keypath = rowMap[indexPath.row] {
exampleObject[keyPath: keypath] = "some value"
}
или для подкласса NSObject (которым является ваш класс), который вы можете использовать setValue:forKeyPath
, как указано в комментариях
if let keypath = rowMap[indexPath.row] {
exampleObject.setValue("some value", forKeyPath: keypath)
}
Это несколько упрощено, поскольку я предполагаю из ваших примеров, что все свойства имеют тип String