#ios #uitableview
#iOS #uitableview
Вопрос:
У меня есть класс Animals, который мне нужно создать с несколькими десятками свойств. В настоящее время список животных отображается в TableView, и при прикосновении я хочу перейти к новому ViewController, который будет иметь TableView со всеми перечисленными свойствами (и доступными для редактирования). Похоже, мне нужно поместить все свойства в массив, чтобы я мог использовать его для просмотра таблицы. Но я не знаю, как это сделать, кроме как вручную войти и создать что-то вроде: animalArray.append(«animal.animalsTypeName», «animal.animalsTypeNotes», «animal.animalsTypeID»…. и т.д. для всех свойств, которые в конечном итоге будут иметь класс.
Есть ли какой-нибудь более простой способ сделать это?
extension AnimalsType {
@nonobjc public class func fetchRequest() -> NSFetchRequest<AnimalsType> {
return NSFetchRequest<AnimalsType>(entityName: "AnimalsType")
}
@NSManaged public var animalsTypeName: String?
@NSManaged public var animalsTypeNotes: String?
@NSManaged public var animalsTypeID: UUID?
@NSManaged public var animalTypetoCore: NSSet?
}
Ответ №1:
Попробуйте это, вы можете поместить его как функцию внутри самого объекта AnimalType или немного изменить его и поместить за пределы класса и изменить reflecting: self
, чтобы отразить экземпляр объекта AnimalsType
public func getAsAnArray() -> [AnimalsType] {
var resultArray = [String]()
let mirroredAnimalType = Mirror(reflecting: self)
for (_, attr) in mirroredAnimalType.children.enumerated() {
if let value = attr.value {
if value.isEmpty {
break
}
resultArray.append(value)
// if you want a dictionary instead you can run
// resultDictionary[attr.label!] = value
// instead of resultArray.append(value)
}
}
return resultArray
}
Если вы решите поместить функцию внутри класса, вы можете использовать ее следующим образом —
let array = animalsType.getAsAnArray()
Простите меня, если я не разбираю это, я вернусь позже и объясню, если потребуется, когда у меня будет время
Комментарии:
1. Ах, это имеет очень хороший смысл! Я всего 2 месяца в обучении, поэтому я ценю помощь здесь. Я использую CoreData, поэтому я не уверен, смогу ли я добавить эту функцию внутри самого класса? Итак, если не в классе, могу ли я просто добавить функцию в контроллер представления представления, которое я планирую использовать?
2. и всего пара вопросов здесь — 1) какова цель использования зеркала 2) Я не знаком с (_, att) частью этого утверждения выше. Если я правильно интерпретирую, он извлекает все атрибуты (свойства?) AnimalType на основе добавления указания, что я ищу дочерние элементы класса и помещаю их в перечислимый формат? Я знаком только с синтаксисом: для attr в mirroredAnimalType.children.enumerated()
3. О зеркалах не так много, но вы можете найти больше в документации Apple здесь 1) Зеркало описывает части, составляющие конкретный экземпляр, такие как сохраненные свойства экземпляра , элементы коллекции или кортежа или его активный регистр перечисления . Это означает, простыми словами, что вы можете использовать mirror для доступа к свойствам объекта. 2) (_, att) — это то, что вы перечисляете, первый — это индекс, который равен _, потому что в данном случае он вам не нужен, а att — это сам дочерний элемент, честно говоря, я никогда не пробовал по-другому.
4. Отлично. Теперь я понял это довольно хорошо. Я попытался использовать его с объектами, управляемыми NS, и мне пришлось выбрать другой маршрут, но зеркало и отражение, как вы предложили, поставили меня точно на путь, который мне нужен, чтобы понять это!
5. Проблема, с которой у меня сейчас возникают проблемы, заключается в том, что у меня есть значения свойств и имена атрибутов, хранящиеся каждое в массивах, как я хочу, и эти массивы загружают.a tableview. представление таблицы не помечено слева, а текстовое поле справа, которое я хочу, чтобы пользователь мог редактировать. на основе indexpath я могу легко определить, какое поле редактируется, но как мне настроить левую часть уравнения, чтобы сказать animal.name = Текстовое поле.текст. где name — это имя атрибута, которое будет меняться в зависимости от того, какая строка нажата. поэтому, в конечном счете, мне нужно, чтобы это было animal.(переменная)