Определение @Binding
по сути является двусторонним соединением с базовым элементом данных, таким как @State
переменная, которая принадлежит другому представлению. Как указано Apple :
Используйте привязку для создания двустороннего соединения между представлением и его базовой моделью.
Если это привязывая, SwiftUI уже обновит свои представления автоматически, если значение изменится; поэтому (в ответ на ваш первый вопрос) вам не нужно делать какие-либо подписки для обновления своего пользовательского представления - это произойдет автоматически.
Аналогично (относительно вашего второго вопроса), поскольку привязка состояние из другого представления, вы не должны также объявлять его как состояние для своего представления, и я также не верю, что это возможно. Состояние - это то, что должно быть чисто внутренним значением для вашего взгляда (Apple настоятельно рекомендует, чтобы все свойства @State
были объявлены private
).
Все это связано с концепцией «Единого источника истины» Apple подчеркнул при представлении SwiftUI: родительское представление, где эта привязка уже @State
, является тем, что владеет информацией, так что это не то, что ваше представление также должно объявлять как состояние.
Для вашего кода, я думаю, все, что вам нужно сделать это второе свойство государства, потому что это не требуется. Просто убедитесь, что передаваемая привязка является свойством @State
в любом родительском представлении, которому принадлежит ваше настраиваемое представление, и передайте его, используя синтаксис $
, для создания этой привязки. Эта статья раскрывает идею более подробно, если вам нужно.
struct MySlider: View {
@Binding var selection: Float?
init(selection: Binding<Float?>) {
self._selection = selection
}
var body: some View {
HStack(spacing: 3) {
ForEach(someValues) { (v) in
Item(value: v, isSelected: v == self.selection)
.onTapGesture {
self.selection = v
}
}
}
}
}