Оповещение с Shake, чтобы отменить - PullRequest
0 голосов
/ 08 марта 2020

Я хочу реализовать встряхивание для отмены в моем приложении iPhone в Swift.

На данный момент это работает, но на нем не отображалось предупреждение с просьбой подтвердить жест отмены (с помощью кнопок "). Отмена »и« Отменить »). Я могу добавить это предупреждение в нужном месте, но я не уверен, что должен. Некоторые статьи заставляют меня думать, что предупреждение должно появляться автоматически, в процессе отмены / повтора, поэтому я кое-что пропустил, возможно ...

Вот соответствующие биты кода

В viewController

override func becomeFirstResponder() -> Bool {
    return true
}

и

override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
   if motion == .motionShake {
       snowflake.undoLastAction()
   }
}

, а в моем классе снежинок действие - вставка или изменение точки в массиве, поэтому я сохраняю значение до изменения в oldPathPoints, затем

   // Action du undo
   undoManager?.registerUndo(withTarget: self, handler: {   (targetSelf) in
        snowflake.pathPoints = oldPathPoints
    })

и, наконец, метод отмены

func undoLastAction() {
    undoManager?.undo()
    createPath()
    }

1 Ответ

0 голосов
/ 22 марта 2020

Итак,

Мне удалось это сделать (с помощью 5-летней Книги от Мэтта Нойбурга!) Итак, нечего делать в viewController, я удалил сталиFirstResponder и motionEnded.

Все в классе SnowFlake: я добавил

    let undoer = UndoManager()

    override var undoManager : UndoManager? {
       return self.undoer
    }
    override var canBecomeFirstResponder: Bool { return true }

Итак, я сообщаю об используемом мной undoManager, и класс (представление здесь) может стать firstResponder

после манипуляции с для просмотра, который можно отменить (в моем случае в touchesEnded), я вызываю

    self.becomeFirstResponder()

Я удалил функцию undoLastAction (теперь бесполезно) и изменил действие отмены на функцию

    changePathUndoable(newPathPoints: finalPathPoints)

функция такая:

    func changePathUndoable(newPathPoints: [CGPoint]) {
        let oldPathPoints = Snowflake.sharedInstance.pathPoints
        Snowflake.sharedInstance.pathPoints = newPathPoints
        // Action du undo
        undoer.setActionName("cutting")
        undoer.registerUndo(withTarget: self, handler: {   (targetSelf) in
            targetSelf.changePathUndoable(newPathPoints: oldPathPoints)
        })

        Snowflake.sharedInstance.createPath()
        self.setNeedsDisplay()
     }

Мне пришлось создать функцию changePathUndoable вместо прямого вызова undoer.registerUndo только для того, чтобы сработало действие redo (я раньше не проверял redo).

Я думаю, что все шаги необходимы, чтобы сделать то, что я хотел: заставить представление получить событие встряхивания, отобразить это диалоговое окно standard undo dialog box и быть в состоянии отменить / повторить изменения.

...