Невозможно отменить, повторить и снова отменить в Swift 4.2 - PullRequest
0 голосов
/ 28 марта 2019

В swift (4.2) я не могу повторить, а затем отменить после первоначальной отмены.Селектор в UndoManager.registerUndo (...) никогда не вызывается во время повтора и последующей отмены

Я пробовал это как в проектах, так и на игровых площадках с бесконечными вариациями.

import Cocoa

class UndoResponder: NSObject {
    @objc func printSender(_ sender: Any) {
        print("printSender: ", sender)
    }
}

var undoResponder = UndoResponder()
var undoManager = UndoManager()
undoManager.registerUndo(withTarget: undoResponder, selector:
    #selector(UndoResponder.printSender(_:)), object: "Hi!")

print("about to undo")
undoManager.undo()
print("about to redo")
undoManager.redo()
print("about to undo")
undoManager.undo()

// output:
// about to undo
// printSender:  Hi!
// about to redo
// about to undo

Ожидаетсявывод:

// about to undo 
// printSender:  Hi! 
// about to redo 
// printSender:  Hi! 
// about to undo 
// printSender:  Hi!

1 Ответ

1 голос
/ 28 марта 2019

Как указано в комментариях к вопросу, я не зарегистрировал повтор.Поэтому я заменил следующее:

import Cocoa

class Undoable {
    var undoManager = UndoManager()
    var object: Any = "None"

    @objc func setObject(_ newObject: Any) {

        let oldObject = object
        object = newObject

        undoManager.registerUndo(withTarget: self, selector:
            #selector(Undoable.setObject(_:)), object: oldObject)
    }

    func undo() {
        undoManager.undo()
        print("after undo: ", object)
    }

    func redo() {
        undoManager.redo()
        print("after redo: ", object)
    }
}

let undoable = Undoable()

print("Initial: ", undoable.object)
undoable.setObject(1)
print("After set: ", undoable.object)
undoable.undo()
undoable.redo()
undoable.undo()

Вывод:

Initial:  (None)
After set:  1
after undo:  (None)
after redo:  1
after undo:  (None)
...