#ios #swift #swiftui
#iOS #swift #swiftui
Вопрос:
У меня есть представление карты, которое содержит список текстовых полей, взятых из CoreData, что-то вроде:
var body: some View {
ZStack {
ForEach(textsArray, id:.self) { text in
TextFieldView(textBlock: text, editing: editing)
.onTapGesture(count: 1) {
selected.selectedText = text
}
}
}
}
Текстовое поле сохраняет свое содержимое и цвет в CoreData.
Эта карточка отображается в режиме редактирования. Вид редактирования также содержит палитру цветов, которая должна позволить вам изменять цвет выбранного текстового поля. Итак, если пользователь нажимает на текстовое поле и начинает его редактировать, в углу экрана появится средство выбора цвета, позволяющее изменять цвет этого поля.
Я попытался создать наблюдаемый объект для отслеживания выбранного текстового поля:
class Selection:ObservableObject {
@Published var selectedText : TextBlock?
}
Тогда мой вид редактирования будет просто отслеживать выбранный текст:
@ObservedObject var selected : Selection = Selection()
Он также передает его в представление карты.
Проблема в том, что представление выбора цвета требует привязки к CGColor . Я не уверен, как передать эту привязку к палитре цветов: я попробовал это:
ColorPicker("", selection: self.selected.selectedText.$color)
Но XCode сообщает мне, что в выделенном тексте нет элемента с именем $color, который, я думаю, потому, что color — это @NSManaged, а не свойство @State.
Как я могу передать привязку свойства Color средству выбора цвета? Правильно ли я вообще к этому подхожу? Я новичок в разработке iOS, поэтому понятия не имею, каковы идиоматические способы ведения дел.
Комментарии:
1. Можете ли вы показать больше своего кода, это поможет понять взаимосвязи между представлениями и моделями
2. Вы могли
@EnvironmentObject
бы получать уведомления из всех представлений3. Почему бы вам просто не привязать управляемый объект к свойству в вашем представлении редактирования, а затем, когда пользователь меняет цвет, вы обновляете объект?
Ответ №1:
Вы можете разделить его на другое представление и вызвать like
if self.selected.selectedText != nil {
MyColorPicker(selection: self.selected.selectedText!)
}
где
struct MyColorPicker: View {
@ObservedObject var selection: TextBlock
var body: some View {
ColorPicker("", selection: self.$selection.color)
}
}