摇动警报以撤消
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修改。
我想在我的 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 只是为了让重做操作起作用(我之前没有测试重做)。
我认为完成我想要的所有步骤都是必要的:使视图接收摇动事件,显示此对话框