前提
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以上には対応できるような方法でお願いします。
あなたの回答
tips
プレビュー