[英]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.