【问题标题】: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 的文档中找到这个例子的解释

标签: ios swift alert shake nsundomanager


【解决方案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 只是为了让重做动作起作用(我之前没有测试重做)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2012-02-16
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多