web-dev-qa-db-ja.com

Swiftuiフォームビューのジャンプアップバグ

Raywenderlichチュートリアルを実行するときに問題が発生しました。フォームビューは、アイテムをクリックするたびに少しずつ上にジャンプします。これはバグですか?とにかくそれを解決する方法はありますか?コードは以下のとおりです。 Contentviewでは、GroupedListStyle()を使用してすべてのアイテムを一覧表示しました。 私のxcodeバージョンは11.2、Swift 5。

enter image description here

以下はTaskEditingView.Swiftです

import SwiftUI

struct TaskEditingView: View {
    @Binding var task: Task

    var body: some View {
        Form {
            TextField("Name", text:$task.name)
            Toggle("Completed", isOn: $task.completed)
        }
    }
}

struct TaskEditingView_Previews: PreviewProvider {
    static var previews: some View {
        TaskEditingView(task: .constant(Task(name: "TO DO")))
    }
}

以下はContentView.Swiftです

import SwiftUI

struct ContentView: View {
    @ObservedObject var taskStore: TaskStore
    @State var modalIsPresented = false

    var body: some View {
        NavigationView {
            List {
                ForEach(taskStore.tasks) { index in
                    RowView(task: self.$taskStore.tasks[index])
                }
                .onMove { sourceIndices, destinationIndex in
                    self.taskStore.tasks.move(
                        fromOffsets: sourceIndices,
                        toOffset: destinationIndex
                    )
                }
                .onDelete { indexSet in
                    self.taskStore.tasks.remove(atOffsets: indexSet)
                }
            }
            .navigationBarTitle("Tasks")
            .navigationBarItems(
                leading: EditButton(),
                trailing:
                Button(
                    action: { self.modalIsPresented = true }
                ) {
                    Image(systemName: "plus")
                }
            )
        }
        .sheet(isPresented: $modalIsPresented) {
            NewTaskView(taskStore: self.taskStore)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView( taskStore: TaskStore() )
    }
}

以下はRowView.Swiftです

import SwiftUI

struct RowView: View {
    @Binding var task: Task

    let checkmark = Image(systemName: "checkmark")

    var body: some View {
        NavigationLink(
            destination: TaskEditingView(task: $task)
        ) {
            if task.completed {
                checkmark
            } else {
                checkmark.hidden()
            }

            Text(task.name)
                .strikethrough(task.completed)
        }
    }
}

struct RowView_Previews: PreviewProvider {
  static var previews: some View {
    RowView(
      task: .constant( Task(name: "To Do") )
    )
  }
}

ContentView.Swift-> RowView.Swift-> TaskEditingView.Swift

8
DaWei Xu

フォーム内のセクションを使用すると、ジャンプのバグがなくなります。セクションの空のヘッダーとフッターを使用する場合、それを行うように見えるはずです。

Form{
       Section(header: Text(""), footer: Text(""), content: {
           Text(...)
           Toggle(...)
       })
    }
2
Max

回避策

私の調査結果では、Formレイアウトの問題のように見えます。したがって、一時的な解決策として、次の回避策は誰かが適用できると思うかもしれません:

Form {
    TextField("Name", text:$task.name)
    Toggle("Completed", isOn: $task.completed)
}
.navigationBarTitle("", displayMode: .inline) // !!!
1
Asperi