我根据此解决方案实现了一个简单的拖放操作,用于在 VStack/Scrollview 中重新排序项目
我将当前拖动的项目存储在名为 的属性中draggingItem,并将不透明度设置为 0,具体取决于它是否为零。当 DropDelegate 中的 PerformDrop 被调用时,我将其设置draggingItem回 nil 以使相应的项目再次可见。
在两种情况下,performDrop 似乎不会被调用:
当项目处于 onDrag 状态,然后原地释放而不移动时。
当该项目确实被释放时,会稍微偏移实际的放置区域。
这导致该项目不再可见,因为draggingItem没有再次设置为零。
对于一个更好的回归draggingItem零的地方有什么想法吗?
看法:
struct ReorderingTestsView: View {
@State var draggingItem: BookItem?
@State var items: [BookItem] = [
BookItem(name: "Harry Potter"),
BookItem(name: "Lord of the Rings"),
BookItem(name: "War and Peace"),
BookItem(name: "Peter Pane")
]
var body: some View {
VStack{
ScrollView{
VStack(spacing: 10){
ForEach(items){ item in
VStack{
Text(item.name)
.padding(8)
.frame(maxWidth: .infinity)
}
.background(Color.gray)
.cornerRadius(8) …Run Code Online (Sandbox Code Playgroud) 我按照苹果的文章进行了相关的商店更改,主要是重复数据删除。https://developer.apple.com/documentation/coredata/consuming_relevant_store_changes
我还下载了 Core Data / CloudKit 演示应用程序,它已经具有重复数据删除过程。https://developer.apple.com/documentation/coredata/synchronizing_a_local_store_to_the_cloud
在演示项目中,我观察到帖子常常会失去与标签的关系。经过一番调查后,我认为当与帖子有关系的标签在相关帖子同步到设备之前在重复数据删除过程中被删除时,就会发生这种情况。
当帖子现在到达设备时,其相关的标签对象不再存在。因此,也不可能找到应连接到 Post 的保留的、已删除重复的标记对象。
我想知道为什么在演示项目中以这种方式实现,因为这确实会导致关键数据丢失。
我也不知道如何避免它。在文章中,Apple 建议使用 Core Datas 逻辑删除来保留已删除对象的某些值。不过,没有进一步的解释。
Demo项目中也没有实现。
如何恢复失去的关系以及墓碑如何帮助修复?
例子:
同步之前:
同步后:
我正在尝试在 SwiftUI 中创建一个自定义列表单元格,其中编辑模式下的拖动图标保留在单元格内。
默认情况下,一旦列表进入编辑模式,单元格就会水平收缩,为拖动手柄和删除按钮腾出空间。
实际上添加 listRowBackground 可以解决这个问题,但是我无法再添加cornerRadius和padding。
现在发生了什么:
期望的行为:
有谁知道如何实现这一点的技巧或解决方案?
示例代码:
struct ListInList: View {
@State var datas = ["Row 1", "Row 2", "Row 3"]
var body: some View {
NavigationView{
List{
ForEach(datas, id: \.self) { data in
HStack{
Text(data)
.frame(maxWidth: .infinity)
.padding()
}
.listRowSeparator(.hidden)
.listRowInsets(EdgeInsets())
.listRowBackground(Color.clear)
.ignoresSafeArea(edges: .horizontal)
.background(Color.gray.opacity(0.3))
.cornerRadius(10)
.deleteDisabled(true)
.padding(EdgeInsets(top: 8, leading: 16, bottom: 8, trailing: 16))
}
.onMove(perform: move)
}
.listStyle(.plain)
.toolbar{
ToolbarItem(placement: .navigationBarTrailing){
EditButton()
}
}
}
}
func move(from source: IndexSet, to destination: Int) …Run Code Online (Sandbox Code Playgroud)