質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

463閲覧

コードでTextFieldの$textを変えた時、システム標準のUndo機能を使う

Octopus_2113

総合スコア0

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2023/01/24 01:37

前提

SwiftUIのTextFieldを使って簡易的なメモ帳のようなアプリを作っています。
そして、そこにシステム標準の機能とは別に、クリップボードのペーストができるボタンや、テキストをクリアするボタンを作りたいと思っています。

発生している問題

TextFieldを設置すると、iOS側でもともとついている3本指スワイプでUndoやRedoができる機能がデフォルトで使えます。また、同じアプリをiPadのシミュレーターやMac Catalystで動かすと、この機能がCommand + ZやCommand + Shift + Zで呼び出せます。
この時TextFieldと結びついている@Stateの変数(text)をコードによって変えてしまうと、3本指スワイプやショートカットキーでののUndoができなくなってしまい、不便になってしまいます。

実現したいこと

コードによってTextFieldのテキストを変更しても、その変更がログされて、3本指スワイプやCommand + Z などのショートカットでUndoやRedoができる機能を持ったTextField(または同様の機能を持ったもの)を作りたいです。

ソースコード(一部)

丸ごとContentView.swiftにコピー&ペーストで動くと思います。

Swift

1import SwiftUI 2 3struct ContentView: View { 4 let UserDefault = UserDefaults.standard 5 6 @State var text = "" 7 8 var body: some View { 9 VStack{ 10 11 //MARK: テキストエディタ 12 TextEditor(text: $text) 13 .font(.body) 14 .padding() 15 .onChange(of: text, perform: {newvalue in 16 UserDefault.set(text, forKey: "text") 17 }) 18 19 HStack{ 20 //MARK: Pasteボタン 21 Button(action: { 22 text = text + (UIPasteboard.general.string ?? "") 23 /* -- 問題の処理 その1 -- 24 これを実行すると、システム標準のUndoのログが消去される 25 このUndoを引き継いでPaste作業をしたい*/ 26 27 }, label: { 28 HStack{ 29 Image(systemName: "doc.on.clipboard") 30 .resizable() 31 .scaledToFit() 32 .frame(width: 24, height: 24) 33 .padding() 34 } 35 36 37 }) 38 .foregroundColor(Color.primary) 39 .cornerRadius(8) 40 41 //MARK: ClearButton 42 Button(action: { 43 text = "" 44 /* -- 問題の処理 その2 -- 45 これも同様に、システム標準のUndoのメニューのログが消去される 46 このUndoを引き継いでTextFieldをクリアしたい*/ 47 }, label: { 48 HStack{ 49 Image(systemName: "xmark") 50 .resizable() 51 .scaledToFit() 52 .frame(width: 24, height: 24) 53 .cornerRadius(8) 54 .padding() 55 } 56 57 }) 58 .background(Color.clear) 59 .foregroundColor(Color.primary) 60 .cornerRadius(8) 61 } 62 } 63} 64 65 66struct ContentView_Previews: PreviewProvider { 67 static var previews: some View { 68 ContentView() 69 } 70}

スクリーンショット
イメージ説明

試したこと

それらしきものとういことで、AppleのUndoManagerのドキュメントを読んでもString型に応用する方法がわからないという状況です。
https://developer.apple.com/documentation/foundation/undomanager

また、このほかにいろいろな記事を読みましたがどれもうまく行っていません。
回答よろしくお願いします。わかりづらい箇所があれば遠慮なく教えてください。

補足情報

Xcode 14.2
可能ならiOS 14以上には対応できるような方法でお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問