カテゴリー: iOS

【SwiftUI】ドラッグ&ドロップでアプリ間の文字列の共有

はじめに

こんにちはsuzukiです。今回はドラッグ&ドロップを利用したアプリ間の文字列の共有について、実装していきます。

ドラッグ&ドロップの実装

今回は実装を行うために、NSItemProviderを利用します。
アプリから拡張機能へのファイルの受け渡し等で利用されることが多い機能です。
今回はこちらの機能を利用して、
ドラッグ側ではText⇨NSItemProvider
ドロップ側ではNSItemProvider⇨Text
を行います。

ドラッグ側の実装

ドラッグ側ではNSItemProviderの生成とドラッグ時の連携する情報を設定します。

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がドロップされさいに動くロジックを設定しています。

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
                    
                }
        }
    }
}

さいごに

今回の内容は異常です。本当は写真アプリから画像をドラッグ&ドロップしたかったのですが、エラーが解消できず、まずはテキストのみの記事にさせていただきました。

おすすめ書籍

suzuki

シェア
執筆者:
suzuki
タグ: SwiftSwiftUI

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前