DaW*_* Xu 10 xcode storyboard ios swift swiftui
我在遵循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")))
}
}
Run Code Online (Sandbox Code Playgroud)
下面是 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() )
}
}
Run Code Online (Sandbox Code Playgroud)
下面是 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") )
)
}
}
Run Code Online (Sandbox Code Playgroud)
ContentView.swift -> RowView.swift -> TaskEditingView.swift
解决方法
根据我的发现,它看起来像是Form布局问题,因此作为临时解决方案,有人可能会发现以下解决方法适用:
Form {
TextField("Name", text:$task.name)
Toggle("Completed", isOn: $task.completed)
}
.navigationBarTitle("", displayMode: .inline) // !!!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1137 次 |
| 最近记录: |