在SwiftUI中使用模态从列表中添加项目

时间:2020-03-30 08:58:50

标签: arrays swiftui swiftui-list

我想知道如何从模态中包含的列表中添加项目,因此当我连续点击时,可以在启动工作表的“第一视图”中选择该项目(更清楚地说,效果您会在iPhone应用程序“消息”从“联系人”中选择一个联系人时找到)。

这是我的基本代码

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 :(得分:1)

  1. 您需要在FirstView中使用@State和@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)
                    }
                }
            }
        }
    }
}

答案 1 :(得分:0)

检查一下:

因为您显然缺少了一些应该阅读的有关@ 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())
    }
}