SwiftUI在列表section之间移动列表项



在下面的代码中,我试图实现从列表部分移动(拖动)到另一个列表部分。

我有一个包含5个元素的枚举和一个包含这些枚举数组的状态变量(activeElements)。在视图中有一个包含两个部分的列表:

  • 第一部分包含从section 2中选择的元素(我们称之为活动元素)
  • 第二部分包含枚举中未包含在选定数组
  • 中的元素。

在section 1中,我应该能够移动元素,也可以将元素拖动到section2中所需的位置。在section 2中,我应该能够将元素拖动到section 1中,我不关心section内的移动元素。

section1工作完美。我的问题是我不能从section2拖到section1。我只能从section 2拖动到section 2(绿色的加号只出现在那里)。如果我在section 2中添加onMove,我就失去了从section 1到section 2的拖动。section只会移动其中的元素。

你有什么建议,如何实现从一个部分到另一个?或者我可以在同一个section的两个foreach之间移动元素

代码如下:

enum RandomElements: Int, CaseIterable {
case element1 = 1
case element2 = 2
case element3 = 3
case element4 = 4
case element5 = 5
}
extension RandomElements {
var string: String {
switch self {
case .element1:
return "element1"
case .element2:
return "element2"
case .element3:
return "element3"
case .element4:
return "element4"
case .element5:
return "element5"
}
}
}
struct TwoSections: View {
@State var activeElements: [RandomElements] = []
@State var listMode: EditMode = .inactive

var body: some View {
List {
Section(header: Text("Active elements")) {
ForEach(activeElements, id: .self) { elem in
HStack {
Text(elem.string)

Spacer()

Image(systemName: "minus")
.onTapGesture { activeElements.remove(at: activeElements.firstIndex(of: elem)!) }
}
.onDrag { NSItemProvider(object: String(elem.rawValue) as NSString ) }
}
.onInsert(of: [.plainText], perform: dropToSection1)
.onMove { (indexSet, index) in
activeElements.move(fromOffsets: indexSet, toOffset: index)
}
}

Section(header: Text("Available elements")) {
ForEach(RandomElements.allCases, id: .self) { elem in
if !activeElements.contains(elem) {
HStack {
Text(elem.string)

Spacer()

Image(systemName: "plus")
.onTapGesture { activeElements.append(elem) }
}
.onDrag { NSItemProvider(object: String(elem.rawValue) as NSString ) }
}
}
.onInsert(of: [.plainText], perform: dropToSection2)
//                .onMove { (indexSet, index) in
//                }
}
}
.toolbar {
EditButton()
}
.environment(.editMode, .constant(.active))
}

private func dropToSection1(at index: Int, _ items: [NSItemProvider]) {
for item in items {
_ = item.loadObject(ofClass: String.self) { droppedString, _ in
if let statusType = Int(droppedString ?? "") {
activeElements.remove(at: activeElements.firstIndex(of: RandomElements(rawValue: statusType)!)!)
}
}
}
}

private func dropToSection2(at index: Int, _ items: [NSItemProvider]) {
for item in items {
_ = item.loadObject(ofClass: String.self) { droppedString, _ in
if let statusType = Int(droppedString ?? "") {
print("append (RandomElements(rawValue: statusType)!)")
activeElements.insert(RandomElements(rawValue: statusType)!, at: index)
}
}
}
}
}

技巧是只使用一个ForEach。你不能在不同的"foreach"之间移动项目。块。

这个对我有效:

List {    
ForEach(0 ..< 10) { i in
Section {
Text(String(i))
} header: {
if(i==0) {
Text("First Header")
}
if(i==5) {
Text("Second Header")
}
}

}
.onMove(perform: move)
.onDelete(perform: delete)
}

从header块中不返回任何内容。

最新更新