Используйте модальные для добавления элемента из списка в SwiftUI - PullRequest
0 голосов
/ 30 марта 2020

Я хотел бы знать, как добавить элемент из Списка, включенного в Модал, поэтому, когда я нажимаю на строку, я могу выбрать элемент в Первом Представлении, которое запустило лист (чтобы сделать более ясным, эффект Вы найдете, когда приложение iPhone «Сообщения» выбирает контакт из «Контакты»).

Вот мой базовый c код

struct Product : Hashable { 

  var name : String

  init(name: String) {
    self.name = name
  }

  func hash(into hasher: inout Hasher) {
    hasher.combine(name)
  }
}


class Manager {

  var product : [Product] = []

  init() {


    let pencil = Product(name: "Pencil")
    let eraser = Product(name: "Eraser")
    let ruler = Product(name: "Notebook")

    product = [pencil, eraser, ruler]

  }
}

struct FirstView: View {

  @State var isSheetOpened = false
  var products : Manager

  var body: some View {
      VStack {
      Button(action: {
          self.isSheetOpened.toggle()
      }) {
          Text("Add item from sheet")
      }
      .sheet(isPresented: self.$isSheetOpened) {
          Sheet(products: self.products, isSheetOpened: self.isSheetOpened)
      }

      Text("Add here")

    }
  }
}

struct Sheet: View {

  var products : Manager
  var isSheetOpened : Bool

  var body: some View {
      VStack {
          List {                
              ForEach(self.products.product, id: \.self) { index in
                Text(index.name)
            }
        }
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 30 марта 2020
  1. Вам потребуется использовать @State в FirstView и @Binding to Sheet, чтобы отобразить выбранный элемент в FirstView.

  2. Кроме того, чтобы закрыть представление после выбора элемента на листе, можно использовать переменную среды presentationMode.

Вот код, который Является ли. Надеюсь, поможет.

struct FirstView: View {
    @State var isSheetOpened = false
    @State var selectedProduct: String = ""
    var products = Manager()

    var body: some View {
        VStack {
            Button(action: {
                self.isSheetOpened.toggle()
            }) {
                Text("Add item from sheet")
            }
            .sheet(isPresented: self.$isSheetOpened) {
                Sheet(products: self.products, isSheetOpened: self.isSheetOpened, selectedProduct: self.$selectedProduct)
            }

            Text("\(selectedProduct)")
        }
    }
}

struct Sheet: View {
    var products : Manager
    var isSheetOpened : Bool
    @Binding var selectedProduct: String
    @Environment(\.presentationMode) var presentationMode

    var body: some View {
        VStack {
            List {
                ForEach(self.products.product, id: \.self) { index in
                    Button(action: {
                        self.selectedProduct = index.name
                        self.presentationMode.wrappedValue.dismiss()
                    }) {
                        Text(index.name)
                    }
                }
            }
        }
    }
}
0 голосов
/ 30 марта 2020

проверьте это:

Поскольку вам явно не хватает некоторых базовых c знаний, которые вы должны прочитать о @Binding, ObservableObject, EnvironmentObject ... без этого вы никогда не сможете написать приложение в SwiftUI.

import SwiftUI

struct Product : Hashable {

    var name : String

    init(name: String) {
        self.name = name
    }

    func hash(into hasher: inout Hasher) {
        hasher.combine(name)
    }
}


class Manager : ObservableObject {

    @Published var chosenProducts : [Product] = []
    var products : [Product] = []

    init() {

        let pencil = Product(name: "Pencil")
        let eraser = Product(name: "Eraser")
        let ruler = Product(name: "Notebook")

        products = [pencil, eraser, ruler]
    }
}
struct ContentView: View {

    @EnvironmentObject var manager : Manager

    @State var isSheetOpened = false

    var body: some View {
        VStack {
            Button(action: {
                self.isSheetOpened.toggle()
            }) {
                Text("Add item from sheet")
            }
            Text("Chosen products")
                .font(.largeTitle)
            List {
                ForEach(self.manager.chosenProducts, id: \.self) { product in
                    Text(product.name)
                }
            }
            .sheet(isPresented: self.$isSheetOpened) {
                Sheet(isSheetOpened: self.$isSheetOpened)
                    .environmentObject(self.manager)
            }

            Text("Add here")

        }
    }
}

struct Sheet: View {

    @EnvironmentObject var manager : Manager

    @Binding var isSheetOpened : Bool

    var body: some View {
        VStack {
            List (self.manager.products, id: \.self) { product in
                Button(action: {
                    self.manager.chosenProducts.append(product)
                    self.isSheetOpened = false
                }) {
                    Text(product.name)
                }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environmentObject(Manager())
    }
}
...