How to make items draggable on macOS OutlineGroup?

Viewed 160

Currently, .itemProvider is not working properly with OutlineGroup.

  • OutlineGroup in List: Not Work
  • Hierarchical List: Not Work
  • Pure List: Work

I think it is a bug or SwiftUI doesn't support it yet.

Is there any workaround? or should I use cocoa OutlineView for this feature?

Reproduce:

Copy and Paste code below, and drag items.

import SwiftUI
import PlaygroundSupport

var greeting = "Hello, playground"

struct FileItem: Hashable, Identifiable {
    var id: Self { self }
    var name: String
    var children: [FileItem]? = nil
}

let data = FileItem(name: "users", children:
  [FileItem(name: "user1234", children:
    [FileItem(name: "Photos", children:
      [FileItem(name: "photo001.jpg"),
       FileItem(name: "photo002.jpg")]),
     FileItem(name: "Movies", children:
         [FileItem(name: "movie001.mp4")]),
          FileItem(name: "Documents", children: [])]),
     FileItem(name: "newuser", children:
       [FileItem(name: "Documents", children: [])])])

struct ContentView: View {
    var body: some View {
        VStack {
            Text("Not Work - OutlineGroup in List")
            List {
                OutlineGroup(data, children: \.children) { item in
                    Text("\(item.name)")
                        .itemProvider { NSItemProvider(object: item.name as NSString) }
                }
            }

            Text("Not Work - Hierarchical List")
            List {
                OutlineGroup(data, children: \.children) { item in
                    Text("\(item.name)")
                        .itemProvider { NSItemProvider(object: item.name as NSString) }
                }
            }

            Text("Work without item info")
            List {
                OutlineGroup(data, children: \.children) { item in
                    Text("\(item.name)")
                }
                .itemProvider { NSItemProvider() }
            }

            Text("Work - Pure List")
            List([
                FileItem(name: "Documents", children: []),
                FileItem(name: "Files", children: [])
            ]) { item in
                Text("\(item.name)")
                    .itemProvider { NSItemProvider(object: item.name as NSString) }
            }
        }
        .frame(width: 320, height: 800)
    }
}

PlaygroundPage.current.setLiveView(ContentView())
0 Answers
Related