【问题标题】:SwiftUI Glitches in FormViewFormView 中的 SwiftUI 故障
【发布时间】:2020-04-18 02:45:23
【问题描述】:

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

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

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

  1. 当我选择带有Picker 的项目时,我将导航到一个单独的视图(如预期的那样),但在页面过渡动画完成后,我可以从中选择项目的列表稍微向上移动。
  2. 选择“已经完成”时,然后从@ 987654327选择日期并关闭拾取器时,在隐藏之前,在视图内部的拾取器故障。

可以使用以下代码 sn-p 来实现一个最小的可行示例:

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 错误还是我的代码中的一些错误。任何帮助表示赞赏。

【问题讨论】:

  • 当我使用 Picker 选择一个项目时,我被导航到一个单独的视图(如预期的那样),但是我可以从中选择项目的列表在页面过渡动画之后向上移动一点完成。您是在模拟器中还是在设备上看到它?加载后似乎完成了一些布局,然后 2 个字段向上移动。但在设备上不应该被注意到。
  • 不幸的是,与模拟器中相同的故障也发生在设备上。
  • 我遇到了同样的问题,这很有效:stackoverflow.com/a/58982296/12202752希望它有所帮助。

标签: swift swiftui swiftui-form


【解决方案1】:

你可以这样改进它:

                       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)
                }

【讨论】:

  • 非常感谢您的改进。事实上,它改善了视觉故障,但它们仍然没有完全消失。选择列表在第一次出现时仍然移动 - 现在单元格项目在出现时向左移动一点。所以,但我认为这些故障与 SwiftUI 相关并且本身就是代码问题?
  • 你应该提交一个我担心的错误。
猜你喜欢
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-24
  • 2023-04-08
  • 1970-01-01
  • 2016-09-09
相关资源
最近更新 更多