У меня есть основное представление под названием TaskManagementView со списком здесь, если я нажму taskCell > RoundedRectangle, то как отобразить PopupView для этой ячейки data.id в TaskManagementView
вот так мне нужно:
код: с этим кодом, если я нажму taskCell > RoundedRectangle, то PopupView отобразится внутри всех ячеек. как исправить и добиться o/p, как на экране выше
struct TaskManagementView: View {
@Environment(\.dismiss) var dismiss
@StateObject private var viewModel = TaskManagementViewModel()
@State private var isComposeViewShown = false
var body: some View {
ZStack {
VStack(spacing: 0) {
VStack {
List {
ForEach(0..<viewModel.arrData.count, id: \.self) { i in
let data = viewModel.arrData[i]
Section {
if data.isExpanded {
ForEach(0..<data.items.count, id: \.self) { j in
taskCell(data: data.items[j])
.onTapGesture {
gotoTaskDetails = true
}
}
}
}
}
}
}
}
.onAppear {
viewModel.fetchTasks(filterId: selectedFilterId) { status in
}
}
}
}
@ViewBuilder func taskCell(data: TaskManagementData) -> some View {
HStack(spacing: 16) {
RoundedRectangle(cornerRadius: 2)
.frame(width: 12, height: 12)
.foregroundStyle(Color.orange)
.onTapGesture {
print("testing data id... \(data.id)")
isComposeViewShown.toggle()
}
if isComposeViewShown {
PopupView(isComposeViewShown: $isComposeViewShown)
}
VStack(alignment: .leading, spacing: 2) {
Text(data.taskTitle ?? "")
.lineLimit(1)
}
}
}
}
struct PopupView: View {
@Binding var isComposeViewShown: Bool
var body: some View {
ZStack {
Color.black.opacity(0.5)
.edgesIgnoringSafeArea(.all)
.onTapGesture {
isComposeViewShown = false
}
//some other code of popup design
.padding(.bottom, 150)
}
}
}
плохой результат приведенного выше кода: почему PopupView отображается внутри ячейки? мне нужен PopupView в TaskManagementView





Вы помещаете всплывающее окно внутрь taskCell, что означает, что оно будет отображаться для каждого taskCell на экране.
Вы помещаете всплывающее окно в HStack, что означает, что оно будет отображаться горизонтально вместе с остальным содержимым taskCell.
Чтобы это исправить, наложите всплывающее окно на ваше представление, используя ZStack
ZStack {
VStack(spacing: 0) {
List {
ForEach(0..<viewModel.arrData.count, id: \.self) { i in
...
}
}
}
.onAppear {
...
}
if isComposeViewShown {
PopupView(isComposeViewShown: $isComposeViewShown)
}
}
Пожалуйста, посмотрите , как использовать представления стека в SwiftUI ,
В настоящее время у вас есть
taskCell, который содержит вашPopupView(...)внутриForEachвнутри другогоForEachвнутриList. Я рекомендую вам переместить звонок на свойPopupView(...)за пределы всехForEachи за пределыList. Используйте@State var, чтобы указать, какой элемент вы нажали, и используйте его при вызовеPopupView(...).