将 SwiftUI 修饰符 .onMove() 限制为仅当前列表

问题描述 投票:0回答:2

我在 List/ForEach 中声明了两个单独的项目列表,如下所示:

List {
    ForEach(model) { item in
        ItemView(item)
            .tag(item.id)
    }
    .onMove(perform: { rows, newIndex in
        model.move(items: rows, destination: newIndex)
    })
}

两个列表都使用不同的模型,由其 ID 标识。然而,在 macOS 上,我意识到我可以将项目从一个列表拖动到另一个列表,尽管它们的 ID 不同。

是否有可能在拖动时禁用另一个列表的放置功能(例如通过

.onInsert()
)?我已经使用
NSItemProviderReading
NSItemProviderWriting
实现了一个功能,能够检测用户何时开始拖动。

swift macos swiftui
2个回答
2
投票

您可以尝试忽略插入,就像在适合我的测试代码中一样:

struct ContentView: View {
    @State private var model1 = ["One", "Two", "Three", "Four"]
    @State private var model2 = ["Five", "Six", "Seven", "Eight"]
    
    var body: some View {
        VStack {
            List {
                ForEach(model1, id: \.self) { item in
                    Text(item)
                }
                .onMove { (indexSet, index) in
                    model1.move(fromOffsets: indexSet, toOffset: index)
                }
                .onInsert(of: [UTType.text]) { pos,prov in
                    print("\n-----> ignoring insert in model1")
                }
            }
            Divider()
            List {
                ForEach(model2, id: \.self) { item in
                    Text(item)
                }
                .onMove { (indexSet, index) in
                    model2.move(fromOffsets: indexSet, toOffset: index)
                }
                .onInsert(of: [UTType.text]) { pos,prov in
                    print("\n-----> ignoring insert in model2")
                }
            }
        }
    }
}

0
投票

此代码实际上在带有 XCode 15.4 的 macOS 14.5 中不再工作。 onInsert 代码永远不会被触发,也不会出现任何可以在任一列表中插入项目的视觉指示符。 似乎 of 类型没有被正确识别,或者 onInsert 在 MacOS 中不再起作用。 有什么想法吗?

© www.soinside.com 2019 - 2024. All rights reserved.