実装でいくつかの奇妙な不具合に直面していForm
ます。これが何らかの実装エラーなのか、SwiftUI 自体のバグなのかはわかりません。
だから基本的にやりたいことは、典型的な「ToDo/TimeTracking」アプリです。プロジェクト エンティティを参照する新しいタスク エンティティを作成したいと考えています。Form
そのため、プロジェクトを選択し、タスクのタイトルとメモ、および開始日と終了日を設定できる場所 を作成しました。
しかし今、私はいくつかの視覚的な不具合を経験しています。
- でプロジェクトを選択すると、
Picker
(予想どおり) 別のビューにナビゲートされますが、ページ遷移アニメーションが終了した後、プロジェクトを選択できるリストが少し上に移動します。 - [既に完了] を選択してから日付を選択し
DatePicker
てピッカーを閉じると、ビューが非表示になる前にピッカーがビュー内でグリッチします。
次のコード スニペットを使用すると、実行可能な最小限の例を実現できます。
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 のバグなのか、私のコードのエラーなのかを知っているかもしれません。どんな助けでも大歓迎です。