bugfix> swift > 投稿

私は追加しようとしています元に戻す そしてやり直す  UITextView の実装の機能 。私は attributedText を使用しています単に text ではありません UITextView のプロパティ 。 undoManager で関数呼び出しを使用してみましたに引用されているようにAppleのドキュメント、しかし何も起きていないようです。グーグルでこのテーマについて何も見つけられなかったことに驚いた。 UITextView で元に戻すとやり直しを実装する前にこの問題に遭遇した人はいますか? attributedText と/これについてどうやって行くのか知っていますか?

サンプルコード

textView.attributedText = NSMutableAttributedString(string: "SOME TEXT")
@objc func undo(_ sender: UIButton) {
    textView.undoManager?.undo()
}
@objc func redo(_ sender: UIButton) {
    textView.undoManager?.redo()
}

回答 2 件
  • UITextView の元に戻す/やり直しを処理するサンプルコードを次に示します。 。元に戻す/やり直しボタンの状態を、テキストを変更するたびに更新することを忘れないでください。

    class ViewController: UIViewController {
        @IBOutlet weak var textView: UITextView!
        @IBOutlet weak var undoButton: UIButton!
        @IBOutlet weak var redoButton: UIButton!
        override func viewDidLoad() {
            super.viewDidLoad()
            updateUndoButtons()
        }
        @IBAction func undo(_ sender: Any) {
            textView.undoManager?.undo()
            updateUndoButtons()
        }
        @IBAction func redo(_ sender: Any) {
            textView.undoManager?.redo()
            updateUndoButtons()
        }
        func updateUndoButtons() {
            undoButton.isEnabled = textView.undoManager?.canUndo ?? false
            redoButton.isEnabled = textView.undoManager?.canRedo ?? false
        }
    }        
    extension ViewController: UITextViewDelegate {
        func textViewDidChange(_ textView: UITextView) {
            updateUndoButtons()            
        }
    }
    
    

    明らかに、アクション/アウトレットとテキストビューのデリゲートアウトレットをストーリーボードに接続する必要があります

  • これはOPの問題の解決策ではありませんが、原油 代替

    UITextFieldデリゲートコールバック textViewDidFinishEditing(textField: UITextField) と組み合わせてスタックデータ構造を実装することでこれを取得できると思う前に、これを処理していません。 。ユーザーがテキストフィールドに変更を加えるたびに、現在の属性付き文字列をスタックに配置するという考え方です。の元に戻す この機能は、ボタンをスタックに接続し、最新の属性付き文字列をポップオフし、それに応じてtextfields属性付き文字列プロパティを設定することで機能します。

あなたの答え