Как быстро получить доступ к undoManager для моего приложения Mac OS?

Я просто пытаюсь отменить действия, которые пользователь выполняет в моем приложении. По умолчанию любое редактирование текста, которое делает пользователь, имеет преимущество отмены, но любые действия, которые выполняются иначе (из моего кода), этого не делают.

Я вижу, что в документации объясняется, что мне нужно получить экземпляр NSUndoManager и вызвать registerUndoWithTarget, но я застрял на первом шаге: получить undoManager из моего ViewController. Поскольку ViewController является UIResponder, я попробовал это:

if let undoManager = self.undoManager {
            undoManager.registerUndoWithTarget(self, selector: Selector("removeLatestEntry:"), object: "test")
        }

Поскольку эта привязка возвращает nil, я подумал, что, возможно, ViewController не имеет undoManager, поэтому я искал его в окне:

if let window = NSApplication.sharedApplication().mainWindow {
        if let undoManager = window.undoManager {
            undoManager.registerUndoWithTarget(self, selector: Selector("removeLatestEntry:"), object: "test")
        }
    }

Увы, привязка окна также возвращает nil. Извините, я очень новичок в этом. Может кто-то указать мне верное направление? Должен ли я реализовать свой собственный undoManager или что-то в этом роде? Где-то явно есть undoManager, потому что все, что пользователь делает вручную в моем текстовом поле, получает поведение отмены. Похоже, это будет синглтон, к которому я мог бы легко получить доступ из ViewController.

-- Редактировать: Кстати, приведенный выше код был помещен в viewDidLoad, а removeLatestEntry — это просто функция в моем ViewController, которая принимает строку и печатает ее в этот момент.


person Subcreation    schedule 01.06.2015    source источник


Ответы (1)


Чтобы использовать undoManager, ViewController должен быть первым ответчиком. Так:

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    becomeFirstResponder()
}

Затем, где бы ни было определено ваше действие, которое необходимо отменить, вы регистрируете отмену и передаете ему все, что нужно для отмены этого действия. Итак, в моем случае:

func addEntry(activity: String) {
    // some other stuff…
    undoManager!.registerUndoWithTarget(self, selector: Selector("removeLatestEntry:"), object: activity)
}
person Subcreation    schedule 03.06.2015
comment
Для меня это null даже после вызова becomeFirstResponder() в viewDidLoad(). Я использую Swift 5.1. Есть ли что-то еще, что мне нужно иметь в виду? Я также прослушиваю события keyDown в том же ViewController. И я не устанавливаю имя действия. Я надеюсь, что это не вызывает проблему. - person Ram Patra; 28.04.2020
comment
Это тоже не работает для меня. undoManager по-прежнему nil - person Alex; 11.05.2020