Raywenderlichチュートリアルを実行するときに問題が発生しました。フォームビューは、アイテムをクリックするたびに少しずつ上にジャンプします。これはバグですか?とにかくそれを解決する方法はありますか?コードは以下のとおりです。 Contentviewでは、GroupedListStyle()を使用してすべてのアイテムを一覧表示しました。 私のxcodeバージョンは11.2、Swift 5。
以下は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
フォーム内のセクションを使用すると、ジャンプのバグがなくなります。セクションの空のヘッダーとフッターを使用する場合、それを行うように見えるはずです。
Form{
Section(header: Text(""), footer: Text(""), content: {
Text(...)
Toggle(...)
})
}
回避策
私の調査結果では、Form
レイアウトの問題のように見えます。したがって、一時的な解決策として、次の回避策は誰かが適用できると思うかもしれません:
Form {
TextField("Name", text:$task.name)
Toggle("Completed", isOn: $task.completed)
}
.navigationBarTitle("", displayMode: .inline) // !!!