摇动撤消警报
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 只是为了让重做动作起作用(我之前没有测试重做)。
我认为所有步骤都是做我想做的事所必需的:让视图接收摇晃事件,显示这个对话框 并能够撤消/重做修改。
【讨论】:
以上是关于摇动撤消警报的主要内容,如果未能解决你的问题,请参考以下文章