SwiftUI - представить 3 разных представления с разными параметрами

Мне нужно представить 3 разных представления.

   AddListView
   ChangeColor
   EditListView

Они принимают разные параметры. AddListView не имеет параметра, а ChangeColor и EditListView принимает цвет и NSManagedObject соответственно. Однако для простоты параметр EditListView в этом примере является целым числом.

Я использую .fullScreenCover(item: <#T##Binding<Identifiable?>#>, content: <#T##(Identifiable) -> View#>) для их представления.

.fullScreenCover(item: $presentedViewType) { type in
    if type == .AddListView {
        AddListView()
    }
    else if type == .EditListView {
        if let index = selectedIndex {
            EditListView(index: index)
        }
    }
    
    else if type == .ChangeColor {
        if let color = selectedColor {
            ColorView(color: color)
        }
    }
}

selectedIndex и selectedColor это nil, хотя я инициализирую их перед инициализацией presentedViewType. И, следовательно, представлен EmptyView.

Это проект.

enum PresentedViewType: Identifiable {
    case AddListView
    case ChangeColor
    case EditListView
    
    var id: Int {
        return hashValue
    }
}


struct ContentView: View {
    
    @State var presentedViewType: PresentedViewType?
    
    @State var selectedColor: Color?
    
    @State var selectedIndex: Int?
    
    var body: some View {
        NavigationView {
            List {
                
                Section {
                    NavigationLink(destination: Text("All")) {
                        Text("All")
                    }
                    .background(Color.blue)
                    .contextMenu {
                        Button(action: {
                            selectedColor = .blue
                            presentedViewType = .ChangeColor
                        }) {
                            Label("Change Color", systemImage: "paintbrush.pointed.fill")
                        }
                    }
                }
                
                ForEach(0..<10) { index in
                    NavigationLink(destination: Text("Row Details \(index)")) {
                        Text("Row \(index)")
                    }
                    .contextMenu {
                        Button(action: {
                            selectedIndex = index
                            presentedViewType = .EditListView
                        }) {
                            Label("Edit", systemImage: "square.and.pencil")
                        }
                    }
                }
                
            }
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button(action: {
                        presentedViewType = .AddListView
                    }) {
                        Label("Add", systemImage: "plus")
                    }
                }
            }
            .fullScreenCover(item: $presentedViewType) { type in
                if type == .AddListView {
                    AddListView()
                }
                else if type == .EditListView {
                    if let index = selectedIndex {
                        EditListView(index: index)
                    }
                }
                
                else if type == .ChangeColor {
                    if let color = selectedColor {
                        ColorView(color: color)
                    }
                }
            }
        }
    }
}



struct ColorView: View {
    @Environment(\.presentationMode) var presentationMode
    
    @State var color: Color
    
    var body: some View {
        NavigationView {
            Text("Color View")
                .background(color)
                .toolbar {
                    ToolbarItem(placement: .navigationBarLeading) {
                        Button(action: {
                            presentationMode.wrappedValue.dismiss()
                        }) {
                            HStack {
                                Image(systemName: "xmark")
                            }
                        }
                    }
                }
        }
    }
}



struct  AddListView: View {
    @Environment(\.presentationMode) var presentationMode
    @State var text: String = ""
    
    var body: some View {
        NavigationView {
            TextField("", text: $text)
                .toolbar {
                    ToolbarItem(placement: .navigationBarLeading) {
                        Button(action: {
                            presentationMode.wrappedValue.dismiss()
                        }) {
                            HStack {
                                Image(systemName: "xmark")
                            }
                        }
                    }
                }
        }
    }
}



struct  EditListView: View {
    @Environment(\.presentationMode) var presentationMode
    
    @State var index: Int
    
    var body: some View {
        NavigationView {
            Text("Row \(index)")
                .toolbar {
                    ToolbarItem(placement: .navigationBarLeading) {
                        Button(action: {
                            presentationMode.wrappedValue.dismiss()
                        }) {
                            HStack {
                                Image(systemName: "xmark")
                            }
                        }
                    }
                }
        }
    }
}

Я должен отметить, что они не имеют фиксированной стоимости. Они имеют разное значение в зависимости от того, какую строку вам нужно отредактировать.

Как передать selectedIndex и selectedColor на EditListView и ColorView соответственно?

Обновлять

EditListView берет только selectedIndex, а ColorView берет только selectedColor

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
151
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас должны быть свойства @Binding внутри EditListView и ColorView

struct EditListView: View {

    @Binding var selectedIndex: Int?

    // rest of view implementation
}

struct ColorView: View {

    @Binding var selectedIndex: Int?

    // rest of view implementation
}

а затем передать привязку в инициализаторы

.fullScreenCover(item: $presentedViewType) { type in
    if type == .AddListView {
        AddListView()
    } else if type == .EditListView {
        EditListView(index: $selectedIndex)
    } else if type == .ChangeColor {
        ColorView(color: $selectedColor)
    }
}

Другие вопросы по теме