首页 > 解决方案 > SwiftUI .onDrag 在表单中的项目上使所有表单可拖动

问题描述

我做了一个简单的胶囊文本项目拖放到文本区域。目标文本值将删除的项目作为文本获取,并且更改为值。

以下代码可以正常工作,我相信它对想要执行拖放操作的初学者很有用。

我遇到的问题是,当可拖动项目包含在表单中时,会拖动所有表单,而不是仅拖动所选项目。

要复制它,只需取消注释表单 { }

我错过了什么还是真的是一个错误。

import SwiftUI
import UniformTypeIdentifiers

struct DragView: View {
    var body: some View {
        //Form{
            HStack{
                DropText()
                VStack{
                    ForEach((1...10).reversed(), id: \.self) {
                        CapsuleText(text: "Test \($0)")
                    }
                }
            }
       // }
    }
}


struct DropText: View {
    @State var myText: String = "Glisser ici"
    @State var targeted: Bool = false
    @State private var onDrag = false
    
    var body: some View {
        VStack{Text(myText)}
            .font(.footnote)
            .padding()
            .foregroundColor(.white)
            .background(targeted ? Color.red : Color.green)
            .clipShape(Capsule())
            .onDrop(of: [UTType.text], delegate: DragRelocateDelegate(dropText: $myText, onDrag: $onDrag))
    }
}



struct CapsuleText: View {
    var text: String
    @State private var onDrag = false
    
    var body: some View {
        VStack{Text(text)}
            .font(.footnote)
            .padding()
            .foregroundColor(.white)
            .background(onDrag ? Color.gray : Color.blue)
            .clipShape(Capsule())
            .onDrag {
                self.onDrag = true
                return NSItemProvider(object: String(text) as NSString)
            }
    }
}

struct DragRelocateDelegate: DropDelegate {
    @Binding var dropText: String
    @Binding var onDrag: Bool
    
    func dropEntered(info: DropInfo) {
    }
    
    func dropUpdated(info: DropInfo) -> DropProposal? {
        return DropProposal(operation: .move)
    }
    
    func performDrop(info: DropInfo) -> Bool {
        guard info.hasItemsConforming(to: [UTType.text]) else {
            return false
        }
        let items = info.itemProviders(for: [UTType.text])
        for item in items {
            _ = item.loadObject(ofClass: String.self) { str, _ in
                if let str = str {
                    dropText = str
                }
            }
        }
        return true
    }
}

预期行为

非预期行为

标签: drag-and-dropswiftui

解决方案


推荐阅读