#ios #data-binding #swiftui
#iOS #привязка данных #swiftui
Вопрос:
Лучшее сравнение, которое я могу сделать, — это сравнение с приложением контактов iPhone, которое поставляется со всеми телефонами.
Когда пользователь запускает приложение, в нем перечислены все контакты. Пользователь может выбрать контакт, и для контакта отображается «Подробное представление». Наконец, пользователь может выбрать редактирование контакта и перейти к «Редактированию подробного представления». Просто…
Одна из функций, которые у меня есть в моем приложении, — это точно то же самое.
-
Я представляю список пользователю, и пользователь может щелкнуть по любым элементам в списке.
-
Как только они нажимают на элемент, они могут просмотреть сведения об этом элементе в «Подробном представлении».
-
Пользователь имеет возможность «Редактировать» элементы, где теперь они могут вносить изменения в элемент с помощью текстовых полей в «Редактировать подробное представление».
-
Теперь пользователь может «Сохранить» или «Отменить» свои изменения / правки, если захочет, что вернет их к «Подробному просмотру».
Опять же просто, как в приложении «Контакты».
Итак, вот проблема: «Сохранить» работает безупречно, поскольку я передаю объект как переменную привязки:
@Binding var cigar: Cigar
При изменении текстового поля изменение отразит изменение обратно в «Подробном представлении» после того, как пользователь нажмет «Сохранить», что является желаемым результатом.
Проблема в том, что даже если пользователь нажимает «Отменить», изменения в текстовом поле по-прежнему сохраняются в кавычках, что не является желаемым результатом. Я полагаю, это потому, что я использую @Binding
переменную, и переменная изменяется в реальном времени.
Итак, мой вопрос в том, есть ли какой-либо способ «отвязать» или отменить изменения, которые были внесены в @Binding
переменную / объект, когда пользователь нажимает «Отмена» или хочет отменить сделанные им изменения / правки?
Может кто-нибудь, пожалуйста, помочь, или если вы можете предложить лучший подход для достижения результата.
Ответ №1:
Привязка — это прямая ссылка на источник истины, поэтому при редактировании вы изменяете непосредственно исходные данные, поэтому несвязанные при отмене, т. Е. после применения изменений, не имеют смысла, даже если это было бы возможно (но это не так).
Поскольку у вас есть редактирование с сохранением состояния (т. Е. Применяемое по факту действия сохранения), вам необходимо явное локальное хранилище для этих данных.
Вот возможный подход (в псевдокоде)
struct SomeView: View {
@Binding var cigar: Cigar
@State private var editingCigar: Cigar
init(cigar: Binding<Cigar>) {
self._cigar = cigar
self._editingCigar = State(initialValue: cigar.wrappedValue)
}
var body: some View {
// ... work here with `editingCigar`
Button("Save") {
// !! Copy back edited cigar explicitly
self.cigar = editingCigar
}
Button("Cancel") {
// just close w/o touching self.cigar
}
}
}
Комментарии:
1. Мне пришлось изменить на
self._editingCigar = State(initialValue: cigar.wrappedValue)
(обратите внимание на подчеркивание)2. @Charlyberthet, да, спасибо — похоже, это была опечатка