1

我正在自己制作一个 ToDo 列表应用程序以尝试熟悉 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()
    }
  }
}

我需要一个函数来获取TextFieldContentViewList

-谢谢您的帮助

4

1 回答 1

0

当用户点击时,您可以在您AddTask的回调中添加一个闭包属性Add Task。像这样:

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通过将BindingtaskList 传递给AddTask. 但我认为AddTask用于添加新任务,因此它应该只关注新任务而不是完整的任务列表。

于 2021-06-05T17:47:53.720 回答