はじめに
こんにちはsuzukiです。今回はドラッグ&ドロップを利用したアプリ間の文字列の共有について、実装していきます。
ドラッグ&ドロップの実装
今回は実装を行うために、NSItemProviderを利用します。
アプリから拡張機能へのファイルの受け渡し等で利用されることが多い機能です。
今回はこちらの機能を利用して、
ドラッグ側ではText⇨NSItemProvider
ドロップ側ではNSItemProvider⇨Text
を行います。
ドラッグ側の実装
ドラッグ側ではNSItemProviderの生成とドラッグ時の連携する情報を設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import SwiftUI //kUTTypeUTF8PlainTextを指定するのに利用 import CoreServices //ドラッグ側の実装 struct ContentView: View { @State private var dragText = "ドラッグ" @State private var isTarget = false var body: some View { HStack { Text(dragText) .onDrag { //NSItemProviderを生成 let provider = NSItemProvider() //dragTextを元にNSProviderに連携 provider.registerDataRepresentation(forTypeIdentifier: kUTTypeUTF8PlainText as String, visibility: .all) { (completion) -> Progress? in completion(dragText.data(using: .utf8), nil) return nil } return provider } } } } |
ドロップ側の実装
ドロップされた側では、NSItemProviderの中身が何であるか判断をし、ドロップされた場合の処理を記述します。
今回の場合だとkUTTypeUTF8PlainTextを持ったItemがドロップされさいに動くロジックを設定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import SwiftUI import CoreServices struct ContentView: View { @State private var dropText = "ドロップ" @State private var isTarget = false var body: some View { HStack { Text(dropText) .onDrop(of: [kUTTypeUTF8PlainText as String], isTargeted: $isTarget) { providers -> Bool in guard let provider = providers.first else { return false } provider.loadItem(forTypeIdentifier: kUTTypeUTF8PlainText as String, options: nil) { (data, error) in if let str = String(data: data as! Data, encoding: .utf8) { dropText += " \(str)" } } return true } } } } |
さいごに
今回の内容は異常です。本当は写真アプリから画像をドラッグ&ドロップしたかったのですが、エラーが解消できず、まずはテキストのみの記事にさせていただきました。