Swift: Массив пользовательских классов в табличном представлении - редактирование значений: дополнительные принадлежности или другое?
У меня есть собственный класс Medication с именами переменных и направлениями. Я имею это в массиве, представляющем себя в табличном представлении, показывающем Medication.name и Medication.directions.
Я бы хотел, чтобы пользователь мог нажимать либо на строку, либо на вспомогательную кнопку (подробно?), Чтобы редактировать значение в выбранной строке.
Моей идеальной ситуацией было бы меню, которое выпадало из нижней части выбранной строки с редактируемыми полями, которые обновляли строку в массиве и перезагружали таблицу.
Есть ли способ сделать это или что-то подобное? Я играл со скрытыми полями просмотра и заставлял их показывать, когда строка выбрана, но я не уверен, смогу ли я закрепить ее в нижней части выбранной строки? Или я мог бы создать пользовательскую ячейку, в которой есть редактируемые поля в каждой ячейке, скрытые, с фиксированной высотой по отношению к ячейке, которая изменяется при нажатии на нее, чтобы отобразить дополнительные поля.
Аналогично, если лучшим вариантом является использование вспомогательного вида, является ли Деталь наиболее подходящим? Я не могу щелкнуть правой кнопкой мыши и перетащить переход для этого. Или я бы просто использовал это ниже?
optional func tableView(_ tableView: UITableView,
accessoryButtonTappedForRowWithIndexPath indexPath: NSIndexPath)
Если я передам это другому контроллеру представления, мне нужно будет явно использовать делегатов, чтобы изменить массив из представления таблицы, поэтому я надеюсь найти более простое решение.
Спасибо! Ценю любые советы для этого новичка
Вот где я застрял с Segue:
let vc = segue.destinationViewController as! MedDetailViewController
vc.delegate = self
let MedRow = self.tableView.indexPathForSelectedRow()!
let passMed = myMedsList[MedRow] //this row doesn't work
vc.detailMed = passMed
1 ответ
Segue - это не только самый простой способ сделать это, вы также можете воспользоваться функцией раскрутки для автоматического возврата отредактированных значений.
Делегация не нужна. Нет специального кода для добавления скрытых просмотров в вашу ячейку.
Если у вас есть только один переход, добавьте его в строку, а не аксессуар. Пользователи склонны ожидать, что постукивание по строке что-то делает. Если бы он ничего не делал, большинство пользователей не стали бы пытаться нажать на аксессуар.
Постукивание по аксессуару подразумевается как вторичное действие, которое отличается от постукивания по ряду.
Я бы настроил show
перейти прямо в раскадровке. Меньше кода для написания, меньше кода для обслуживания. Пусть раскадровка сделает всю работу за вас.
Обновить:
Вот техническая заметка Apple об использовании Unwind Segues, а также их Swift-пример того, как конечный (представляющий) контроллер представления получает доступ к данным из исходного (представленного) контроллера представления.
@IBAction func unwindToMainMenu(sender: UIStoryboardSegue)
{
let sourceViewController = sender.sourceViewController as! MedDetailViewController
// Update the medsList array with the new detailMed
let medRow = self.tableView.indexPathForSelectedRow().row
medsList[medRow] = sourceViewController.detailMed
}
Обновление 2:
Вы хотите обновить свойство detailMed контроллера подробного представления перед тем, как раскрутить переход, используя метод prepareForSegue:.
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "unwindToMedications"
{
// Update the detailMed if the user has edited it
self.detailMed = ... // the edited medication you're returning
}
}
Обновление 3:
Кнопка "назад" (или пролистывание назад) просто выталкивает контроллер стекаемых представлений из стека, но вызова не вызывается. Вам нужно явно подключить переход с помощью кнопки "Готово", которая раскручивается для вас, и обновить список лекарств.
Причина, по которой вы явно раскручиваете, заключается в том, чтобы различать, хочет ли пользователь зафиксировать или отменить любое изменение. (Они внесли изменения, но они хотят игнорировать это, поэтому они нажали Назад?)
У вас есть два варианта, которые оба будут работать, и вам решать, как вы хотите представить редактируемые детали. (Я предпочитаю нажимать, чтобы показать детали, и модальный для редактирования форм, но в любом случае работает).
Нажмите контроллер подробного просмотра. Есть кнопка Готово. Пользователь может использовать кнопку "Назад" для отмены или кнопку "Готово", чтобы принять любые измененные данные.
Представьте модальный контроллер вида с кнопками Отмена и Готово. Опять же, пользователь может отменить (вернуть без изменений) или нажать Готово, чтобы (вернуть и) принять изменения.
Для любой из презентаций вы можете подключить кнопку "Готово". То, что это будет делать, это вызвать действие размотки контроллера представления списка Meds. В этом коде раскрутки вы получите подробную информацию о лекарствах и обновите список лекарств, как мы уже обсуждали ранее.
Упоминание о базовых данных:
Есть альтернативный подход, который не проще изучить, чем segues, но он отлично подходит. (Что следует иметь в виду, если не для этого приложения, то для следующего.)
Основные данные и NSFetchedResultsController
, Вы сохраняете отредактированное лекарство, и NSFetchedResultsControllerDelegate
обновляет список лекарств для вас.
Кто-то может сказать, что это излишне, но, поскольку я начал использовать NSFetchedResultsController, мне бы хотелось, чтобы я узнал об этом раньше.