#swiftui
#swiftui
Вопрос:
Я пытался разобраться в некоторых ключевых концепциях SwiftUI. Есть одна вещь, которую я до сих пор не совсем понимаю.
Ситуация:
- Иметь массив структур, содержащих различные значения.
- Динамически создавайте представления (например, круги), перебирая этот массив с помощью ForEach .
- Вопрос: Связаны ли вновь созданные представления каким-либо образом с соответствующими им строками массива? Если что-то изменится в Круге, может ли этот Круг сохранить это изменение обратно в структуру в массиве, из которого он был создан?
Я составил диаграмму, чтобы проиллюстрировать это:
Пример использования / проблема, о которой я говорю, заключается в следующем: таким образом, я создаю несколько кругов. Затем круги анимируются, но мне нужно отслеживать их положение… Могу ли я заставить их обновлять его обратно в массив по мере их поступления?
Спасибо!
РЕДАКТИРОВАТЬ: Пример кода:
import SwiftUI
struct blackCircle: Identifiable {
var id = UUID()
var position: CGPoint!
}
class CircleStorage: ObservableObject {
@Published var circles = [
blackCircle(position: CGPoint(x: 10, y: 20)),
blackCircle(position: CGPoint(x: 50, y: 100)),
blackCircle(position: CGPoint(x: 100, y: 50))
]
}
struct ContentView: View {
@StateObject var circleStorage = CircleStorage()
var body: some View {
ZStack {
ForEach(circleStorage.circles, id: .id) {
circle in
Circle()
.position(circle.position)
.frame(width:44, height:44)
}
}
}
}
Это создает три круга. Мне нужно перебрать круги, проверить их положение и, например, удалить те, у которых x превышает определенное значение. Я могу сделать это, выполнив итерацию по массиву — он содержит позиции, в которых создаются круги. Но что, если их положение изменяется во время выполнения с помощью анимации или перетаскивания и т. Д.? Могу ли я убедиться, что соответствующие строки содержат актуальную позицию, даже если она изменяется?
Комментарии:
1. Можете ли вы опубликовать минимально воспроизводимый код?
2. После
circleStorage.circles
внесения изменений (по любой причине или в любом месте)ForEach
контейнер будет обновлен, а внутренние круги перерисованы. Это реактивная природа SwiftUI.3. Согласен, так что это будет включать обновление элементов из контейнера для перехода к кругам. Однако я имел в виду обновление из круга в контейнер. Если вы захватите круг во время выполнения и переместите его, или он анимируется в другую позицию, соответствующая строка по-прежнему содержит только начальное местоположение. Я бы хотел, чтобы он отслеживал текущую позицию, даже если круг перемещается.
4. Как вы думаете, как работает перетаскивание? На мой взгляд, это было бы событие onDrag, которое записывает данные, что означает, что круги будут перемещаться.
5. Хорошая мысль, спасибо! Таким образом, я могу обновлять данные на каждом шаге onDrag gesture, чтобы и Circle, и данные были актуальными на месте. Тем не менее, все еще существует проблема с кругами, имеющими таймеры и анимацию. В то время как я могу сохранить позицию в данных по завершении анимации, я действительно не уверен, возможно ли это сделать для каждого кадра во время анимации (что, если анимация зациклена?). Честно говоря, в UIKit это было намного проще: просто иметь множество просмотров и получать доступ к их позиции в любое удобное для вас время. В SwiftUI это кажется невозможным без тщательной ручной регистрации каждого движения где-нибудь…