7

我在Form实施中遇到了一些奇怪的故障。我不确定这是一些实现错误还是 SwiftUI 本身的错误。

所以基本上我想做的是典型的“ToDo/TimeTracking”应用程序。我想创建一个引用项目实体的新任务实体。因此,我创建了一个Form可以选择项目、设置任务的标题和注释以及开始和结束日期的地方。

但现在我遇到了一些视觉故障。

  1. 当我选择一个项目时,Picker我正在导航到一个单独的视图(如预期的那样),但是我可以从中选择项目的列表在页面过渡动画完成后向上移动一点。
  2. When selecting "Already finished" and then selecting a date from the DatePickerand closing the picker, the picker glitches around inside the view before it gets hidden.

可以使用以下代码片段来实现一个最小的可行示例:

mport SwiftUI

struct Project {
    let id: Int
    let title: String
}

let projects = [Project(id: 0, title: "Hello"),Project(id: 1, title: "World")]

struct ContentView: View {

     @State private var showingCreateTask = false

    var body: some View {
        NavigationView {
             Text("Hello, World!")
            .navigationBarTitle("Test")
                .navigationBarItems(trailing: Button(action: { self.showingCreateTask.toggle() }) {
                    Image(systemName: "plus").imageScale(.large)
                })
                .sheet(isPresented: self.$showingCreateTask) {
                    CreateTaskView(projects: projects)
            }
        }
    }
}

struct CreateTaskView: View {

    let projects: [Project]

    @State private var selectedProject = 0
    @State private var taskTitle: String = ""
    @State private var taskNotes: String = ""
    @State private var alreadyFinished = false

    @State private var startDate = Date()
    @State private var endDate = Date()

    var body: some View {
        NavigationView {
            Form {
                Section {
                    Picker(selection: $selectedProject, label: Text("Project")) {
                        ForEach(0..<self.projects.count) { index in
                            Text(self.projects[index].title)
                        }
                    }
                }

                Section {
                    TextField("Title", text: $taskTitle)
                    TextField("Notes", text: $taskNotes)
                    Toggle(isOn: $alreadyFinished) {
                        Text("Already finished ?")
                    }
                }

                if alreadyFinished {
                    Section {
                        DatePicker(selection: $startDate, displayedComponents: [.date, .hourAndMinute]) {
                            Text("Start Date")
                        }
                        DatePicker(selection: $endDate, in: startDate..., displayedComponents: [.date, .hourAndMinute]) {
                            Text("End Date")
                        }
                    }
                }

                Button(action: {
                }) {
                    Text("Save changes")
                }
            }
            .navigationBarTitle("Create a new task")
        }
    }
}

也许有人经历过类似的事情,并且知道这是 SwiftUI 错误还是我的代码中的一些错误。任何帮助表示赞赏。

错误视频

4

1 回答 1

0

你可以像这样改进它:

                       NavigationView {
                    Form {
                        Section {
                            Picker(selection: $selectedProject, label: Text("Project")) {
                                ForEach(0..<self.projects.count) { index in
                                    Text(self.projects[index].title).tag(index)
                                }
                            }
                        }

                                       Section {
                                                          TextField("Title", text: $taskTitle)
                                                          TextField("Notes", text: $taskNotes)
                                                          Toggle(isOn: $alreadyFinished) {
                                                              Text("Already finished ?")
                                                          }
                                                      }

                                       Button(action: {
                                       }) {
                                           Text("Save changes")
                                       }

                        if alreadyFinished {
                            Section {

                                DatePicker(selection: $startDate,in: startDate..., displayedComponents: [.date, .hourAndMinute]) {
                                    Text("Start Date")
                                }}
                             Section {
                                DatePicker(selection: $endDate, in: startDate..., displayedComponents: [.date, .hourAndMinute]) {
                                    Text("End Date")
                                    }
                            }.transition(AnyTransition.identity.animation(nil))
                        }


                    }
                    .navigationBarTitle("Create a new task", displayMode: .inline)
                }
于 2019-12-28T20:07:02.793 回答