Реализация отмены и повтора в UITextView с помощью attribuText - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь добавить функциональность undo и redo в мою реализацию UITextView.Я использую attributedText, а не просто text свойство UITextView.Я пытался использовать вызовы функций в undoManager, как указано в документации Apple , однако, похоже, ничего не происходит.Я был удивлен, что не смог найти что-либо на эту тему от Google.Кто-нибудь сталкивался с этой проблемой до / осуществил отмену и повтор на 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 ]

0 голосов
/ 25 мая 2018

Вот пример кода для обработки отмены / повтора для 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()            
    }
}

Очевидно, вам нужно будет подключить действия / выходы и выход делегата текстового представления враскадровка

0 голосов
/ 25 мая 2018

Это не решение проблемы ОП, а сырая альтернатива

Я не занимался этим прежде, чем думаю, что вы могли бы получить это путем реализацииструктура данных стека в сочетании с обратным вызовом делегата UITextField textViewDidFinishEditing(textField: UITextField).Идея состоит в том, что для каждого изменения, которое пользователь вносит в текстовое поле, вы помещаете текущую атрибутивную строку в стек.Функция отменить вступает в игру, подключив кнопку к вашему стеку и вытолкнув последнюю атрибутивную строку и установив соответствующим образом свойство атрибута строки textfields.

...