SwiftUI отслеживает «выбранное» (нажатие на) текстовое поле из внешнего вида

#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)
  }
}