我在模态中呈现一个列表。如果我在 NavigationView 中,EditButton 就完全损坏了。
struct ContentView: View {
@State var showSheetView = false
var body: some View {
NavigationView {
Button(action: {
self.showSheetView.toggle()
}) {
Image(systemName: "bell.circle.fill")
.font(Font.system(.title))
}
.sheet(isPresented: $showSheetView) {
SheetView()
}
}
}
}
struct SheetView: View {
@State private var myArray: [String] = ["One", "Two", "Three"]
var body: some View {
NavigationView {
VStack {
List {
ForEach(myArray, id: \.self) { item in
Text(item)
}.onDelete(perform: { indexSet in
})
}
}
.navigationBarItems(trailing: EditButton())
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我删除我呈现的导航视图,那么一开始它似乎可以工作,第二次我呈现它时它会再次损坏。
struct ContentView: View {
@State var showSheetView = false
var body: some View {
Button(action: {
self.showSheetView.toggle()
}) {
Image(systemName: "bell.circle.fill")
.font(Font.system(.title))
}
.sheet(isPresented: $showSheetView) {
SheetView()
}
}
}
Run Code Online (Sandbox Code Playgroud)
editMode使用 Xcode 12.1 / iOS 14.1 在 macOS Big Sur 上手动处理工作。
EditButton当我旋转模拟器时,我还遇到了在编辑模式下再次显示“编辑”的问题,下面的解决方案也解决了这个问题。
以下解决方案使用EditButton处理手动editMode绑定的自定义结构。首先是定制EditButton:
struct EditButton: View {
@Binding var editMode: EditMode
var body: some View {
Button {
switch editMode {
case .active: editMode = .inactive
case .inactive: editMode = .active
default: break
}
} label: {
if let isEditing = editMode.isEditing, isEditing {
Text("Done")
} else {
Text("Edit")
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用上面的内容EditButton很简单:
struct SheetView: View {
@State private var myArray: [String] = ["One", "Two", "Three"]
@State private var editMode = EditMode.inactive
var body: some View {
NavigationView {
VStack {
List {
ForEach(myArray, id: \.self) { item in
Text(item)
}.onDelete(perform: { indexSet in
})
}
}
.navigationBarItems(trailing: EditButton(editMode: $editMode))
.environment(\.editMode, $editMode)
.animation(.spring(response: 0))
}
}
}
Run Code Online (Sandbox Code Playgroud)
EditButton尾随导航栏中的项目处理保存@State private var editMode在SheetView. editMode然后使用环境将其注入到内部视图中.environment(\.editMode, $editMode)。对于编辑模式转换的动画效果,我发现.spring(response: 0)最合适。
| 归档时间: |
|
| 查看次数: |
1689 次 |
| 最近记录: |