【Swift/SwiftUI】クリップボードへコピーする

目次

概要

Gitなどでブランチ名の部分をクリックすると、クリップボードへコピーすることができる。
そのため、「ここに表示してある文字列をコピーできれば」という悩みを解決することができる。
アプリでもこれを知っておけば、ちょっとしたユーザーの手間を省かせることができると思う。

ソースコード

起動時

import SwiftUI

@main
struct TestApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ClipBoardTestView()
        }
    }
}

View部分

import SwiftUI

struct ClipBoardTestView: View {
    enum Field: Hashable {
        case copyTextField
        case pasteTextField
    }
    
    @ObservedObject private var viewModel = ClipBoardTestViewModel()
    
    @FocusState private var focusedField: Field?
    
    var body: some View {
        VStack {
            Spacer()
            HStack {
                TextField("コピーする文字列を入力してください", text: $viewModel.copiedText)
                    .textFieldStyle(.roundedBorder)
                    .focused($focusedField, equals: .copyTextField)
                    .onTapGesture {
                        focusedField = .copyTextField
                    }
                Button {
                    viewModel.copyText()
                } label: {
                    Image(systemName: "square.on.square")
                }
            }
            Spacer()
            TextField("コピーした文字列をペーストしてください", text: $viewModel.pastedText)
                .textFieldStyle(.roundedBorder)
                .focused($focusedField, equals: .pasteTextField)
                .onTapGesture {
                    focusedField = .pasteTextField
                }
            Spacer()
        }
        .frame(maxWidth: .infinity  ,maxHeight: .infinity)
        .contentShape(RoundedRectangle(cornerRadius: 0))
        .onTapGesture {
            focusedField = .none
        }
    }
}

処理部分

import UIKit

class ClipBoardTestViewModel: ObservableObject {
    
    @Published var copiedText: String = ""
    @Published var pastedText: String = ""
    
    func copyText() {
        UIPasteboard.general.string = copiedText
    }
}

デモ動画

詳細

UIPasteboardクラスを使用してクリップボードにコピーすることができる。
文字列だけでなく、以下のように画像やURL、色もクリップボードにコピーすることができる。

コピーしたいデータコピー方法
文字列UIPasteboard.general.string = “[コピーする文字列]”
画像UIPasteboard.general.image = UIImage(named: “[コピーする画像名]”)
URLUIPasteboard.general.url = URL(string: “[コピーするURL]”)
UIPasteboard.general.color = [コピーする色](例:UIColor.white)

また、TextFieldのフォーカスに関しても記載しているが、それはTextFieldのページに記載しようろ思う。

参考ページ

Webエンジニア学習部屋「【SwiftUI】クリップボードにコピーする方法!自作ボタンでバルーン表示」
Webエンジニア学習部屋「【SwiftUI】@FocusStateとは?複数の入力フォームのフォーカスコントロール」
NonaTechブログ「【SwiftUI】画面タップでキーボードを閉じる方法」