摇动撤消警报

Posted

技术标签:

【中文标题】摇动撤消警报【英文标题】:Alert with Shake to Undo 【发布时间】:2020-03-07 22:59:23 【问题描述】:

我想在我的 iPhone 应用上用 Swift 实现摇晃来撤消。

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

以下是相关的代码

在视图控制器中

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()
    

【问题讨论】:

在您的motionEnded() 中,您可以显示一个UIAlertController,而不是调用snowflake.undoLastAction(),它将调用撤消函数。 @Yonat:我知道这一点,我可以做到,但这是正确的做法,还是使用自动触发警报的 undomanager 的另一种方式,例如 developer.apple.com/design/human-interface-guidelines/ios/… .我没有在 Apple 的文档中找到这个例子的解释 【参考方案1】:

所以,

我成功地做到了(在 Matt Neuburg 的 5 年书籍的帮助下!) 所以,在 viewController 中没什么可做的,我删除了 becomeFirstResponder 和 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 只是为了让重做动作起作用(我之前没有测试重做)。

我认为所有步骤都是做我想做的事所必需的:让视图接收摇晃事件,显示这个对话框 并能够撤消/重做修改。

【讨论】:

以上是关于摇动撤消警报的主要内容,如果未能解决你的问题,请参考以下文章

UIPopover 防止摇晃撤消

chrome 撤消“阻止此页面创建其他对话框”的操作

多个警报视图 - 删除另一个警报视图后面的警报视图

如何在警报管理器中清除以前的警报?

显示警报时从窗口警报中删除警报文本

依次显示两个相同的警报视图。如何区分来自警报 1 和警报 2 的文本?