摇动警报以撤消

Alert with Shake to Undo

我想在我的 iPhone 应用程序上实施摇一摇撤消操作,在 Swift。

现在它可以工作,但它没有显示要求验证撤消手势的警报(使用按钮 "Cancel" 和 "Undo")。我可以自己将此警报添加到正确的位置,但我不确定是否应该这样做。有些文章让我认为警报应该在 undo/redo 过程中自动出现,所以我错过了一些东西,也许...

这里是相关的代码

在viewController

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

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

而在我的雪花class中,操作是在数组中插入或修改点,所以我将更改前的值存储在oldPathPoints中,然后

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

最后是撤消方法

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

所以,

我成功做到了(在 Matt Neuburg 的 5 年书的帮助下!) 所以,在viewController里面没什么可做的,我删除了becomeFirstResponder和motionEnded。

一切尽在雪花class:我加了

    let undoer = UndoManager()

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

所以我把我用的undoManager和class(这里的一个视图)沟通起来可以变成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 只是为了让重做操作起作用(我之前没有测试重做)。

我认为完成我想要的所有步骤都是必要的:使视图接收摇动事件,显示此对话框 并能够undo/redo修改。