Swift UI @State настраивается при первом нажатии
У меня есть простой список для Custom View. Что должно произойти, так это то, что когда один из элементов выбран, он должен отобразить подробное представление для этого элемента. В моем коде, когда я выбираю элемент в первый раз, @Statet selectedListener не устанавливается, поэтому подробное представление не отображается. Если я продолжу выбирать тот же элемент, который был выбран ранее, поведение останется прежним. Однако, если я выберу другой элемент, он будет работать правильно, и я могу вернуться к предыдущему элементу и без проблем просмотреть его подробное представление. Это такая простая вещь, которую я пытаюсь сделать и просто не могу понять, что я делаю неправильно. Любая помощь будет оценена. Спасибо.
struct ListenersListView<Model>: View where Model: ActiveListenerViewModel {
@ObservedObject var viewModel: Model
@State var showDetail = false
@State var selectedListener: UserProfile? = nil
var body: some View {
ScrollView {
VStack(spacing:20) {
ForEach(viewModel.allActiveListeners) { listener in
UserImageSection(listener: listener,
subtext: listener.supportAreas)
.onTapGesture(perform: {
handleTap(listener)
})
}
}
}
.padding(.horizontal,20)
.sheet(isPresented: $showDetail, content: {
if let listener = selectedListener {
ListenerDetailView(listener: listener)
}
else {
// It should never come here but when the first item is selected it does. The only way to not come here is to select another item after the first item has been selected.
Text("Listener not loaded yet")
}
})
}
private func handleTap(_ listener: UserProfile) {
print("Showing listener \(listener.id)")
self.selectedListener = listener
showDetail = true
}
}
2 ответа
В iOS 14, чтобы получить
.sheet
чтобы получить актуальные данные, вы должны использовать
sheet(item:)
вместо
.sheet(isPresented:)
Вы можете увидеть еще один из моих ответов здесь: https://stackoverflow.com/a/66190152/560942 и SwiftUI: переключить .sheet на enum, не работает
В вашем конкретном случае трудно сказать, так как у меня нет вашего
UserProfile
код, но я предлагаю вам:
- Избавьтесь от своего
showDetail
переменная состояния - Удостоверься что
UserDetail
соответствуетIdentifiable
- Измените свой
sheet(isPresented:)
к:
.sheet(item: $selectedListener) { listener in
ListenerDetailView(listener: listener)
}
Это похоже на ошибку в iOS 14.*
Пожалуйста, посмотрите это
Когда я удаляю опцию из вашего кода штата , она работает. Пожалуйста, обратитесь к этому.
(Я немного изменился, чтобы проверить на своей стороне.)
@State var showDetail = false
@State var selectedListener: String = ""
var body: some View {
ScrollView {
VStack {
Text("Click")
}
.contentShape(Rectangle())
.onTapGesture {
handleTap("Handle!")
}
}
.padding(.horizontal,20)
.sheet(isPresented: $showDetail, content: {
if let listener = selectedListener {
Text("Get called")
}
else {
// It should never come here but when the first item is selected it does. The only way to not come here is to select another item after the first item has been selected.
Text("Listener not loaded yet")
}
})
}
private func handleTap(_ listener: String) {
print("Showing listener \(listener)")
self.selectedListener = listener
print(self.selectedListener)
showDetail = true
}