【问题标题】:Use a Modal to Add an Item from a List in SwiftUI在 SwiftUI 中使用模式从列表中添加项目
【发布时间】:2020-07-10 14:51:14
【问题描述】:

我想知道如何从包含在模态中的列表中添加一个项目,所以当我连续点击时,我可以在启动工作表的第一个视图中选择项目(为了更清楚,效果当 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)
            }
        }
    }
  }
}

【问题讨论】:

    标签: arrays swiftui swiftui-list


    【解决方案1】:
    1. 您需要在 FirstView 中使用 @State 和 @Binding to Sheet 以在 FirstView 中显示所选项目。

    2. 另外,要在Sheet中选择项目后关闭视图,可以使用环境变量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)
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 谢谢菲利克斯,你真的很有帮助!
    【解决方案2】:

    看看这个:

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

    【讨论】:

    • 谢谢克里斯。我是 SwiftUI 的早期程序员,我正在开发我的第一个应用程序,所以碰巧我遇到了一些缺乏基本知识的情况。我会以你的代码为基础来扩展我的技能。
    猜你喜欢
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多