簡體   English   中英

SwiftUi中視圖之間的傳遞列表

[英]Passing List between Views in SwiftUi

我正在自己制作一個待辦事項列表應用程序,以嘗試熟悉 iOS 開發,我遇到了一個問題:

我有一個單獨的View鏈接以使用TextField輸入新任務。 這是此文件的代碼:

import SwiftUI

struct AddTask: View {
     @State public var task : String = ""
     @State var isUrgent: Bool = false // this is irrelevant to this problem you can ignore it

    
    var body: some View {
        VStack {
            VStack(alignment: .leading) {
                Text("Add New Task")
                    .bold()
                    .font(/*@START_MENU_TOKEN@*/.title/*@END_MENU_TOKEN@*/)
                TextField("New Task...", text: $task)
                Toggle("Urgent", isOn: $isUrgent)
                    .padding(.vertical)
                Button("Add task", action: {"call some function here to get what is 
in the text field and pass back the taskList array in the Content View"})
               
                 
                
            }.padding()
            Spacer()
        }
    }
    
}


struct AddTask_Previews: PreviewProvider {
    static var previews: some View {
        AddTask()
    }
}

因此,我需要將輸入的任務變量插入到數組中,以便在我的主ContentView文件的列表中顯示。

這是供參考的ContentView文件:

import SwiftUI

struct ContentView: View {
    @State var taskList = ["go to the bakery"]
    
    struct AddButton<Destination : View>: View {

        var destination:  Destination

        var body: some View {
            NavigationLink(destination: self.destination) { Image(systemName: "plus") }
        }
    }
    
    var body: some View {
        VStack {
            NavigationView {
                List {
                    ForEach(self.taskList, id: \.self) {
                    item in Text(item)
                    }
                }.navigationTitle("Tasks")
                .navigationBarItems(trailing: HStack { AddButton(destination: AddTask())})
            }
            
        }
        
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
  }
}

我需要一個 function 來獲取在TextField中輸入的任務,並將其傳遞回ContentView的數組中,以便在用戶的List中顯示

-謝謝您的幫助

當用戶點擊Add Task時,您可以在AddTask中添加一個閉包屬性作為回調。 像這樣:

struct AddTask: View {
  var onAddTask: (String) -> Void // <-- HERE
  @State public var task: String = ""
  @State var isUrgent: Bool = false

  var body: some View {
    VStack {
      VStack(alignment: .leading) {
        Text("Add New Task")
          .bold()
          .font(.title)
        TextField("New Task...", text: $task)
        Toggle("Urgent", isOn: $isUrgent)
          .padding(.vertical)
        Button("Add task", action: {
          onAddTask(task)
        })
      }.padding()
      Spacer()
    }
  }

}

然后,在ContentView

.navigationBarItems(
    trailing: HStack {
      AddButton(
        destination: AddTask { task in
            taskList.append(task)
        }
      )
  }
)

@jnpdx通過將 taskList 的Binding傳遞給AddTask提供了一個很好的解決方案。 但我認為AddTask用於添加新任務,因此它應該只關注新任務而不是完整的任務列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM