【问题标题】:Best practice for implementing undo-redo in iPhone在 iPhone 中实现 undo-redo 的最佳实践
【发布时间】:2013-02-07 16:01:48
【问题描述】:

我正在尝试使用 Objective-C 开发一个 iPhone 应用程序(演示项目),它可以将多种摄影效果应用于图像。

应用程序已启动并正在运行,但我想在 UI 中实现“撤消”和“重做”功能。我已经成功编写了一级撤消重做代码,即轻松地向后或向前一步。但是当合并多个级别的撤消和重做操作时,这个概念会变得复杂。当用户撤消一系列步骤然后分支到做其他事情时,它变得特别模糊。我试图拯救的状态越多,我就越迷惑。

我想知道是否有实施此类操作的标准最佳做法。我应该使用的任何架构或框架?这样做的普遍接受的程序是什么?任何有关简化此方法的一般建议将不胜感激。

请帮忙。

【问题讨论】:

  • 尝试在您的应用中实现存档和未存档的概念...
  • 您的应用程序的复杂程度和内存密集程度如何?您可以只实现一个堆栈,并使用 push/pop 范例向前和向后移动。
  • 您是建议存档字符串表示正在应用的效果还是将图像存档为对象本身?我想过……但觉得第一种方法可能有点难以解码和管理,第二种方法会给记忆带来灾难。但是,如果不尝试,我不能确定。不过,感谢您的建议。
  • @Bergasms:相当消耗内存。 Stack 绝对是好的和简单的,但我想知道当用户返回几步并创建一个新分支时会发生什么。你不认为树结构更适合这个目的吗?此外,当我从堆栈中推送/弹出效果时......我是否会实时将效果应用于显示的视图?回到之前的效果是相当复杂的。因此,每次用户后退一步时,我都必须从根节点开始并遍历整个堆栈以到达第 (n-1) 步。您对此有何看法?
  • @user2041826 您可以在堆栈中而不是树中跟踪您的操作,因为树会增加您的复杂性。

标签: iphone ios objective-c xcode undo-redo


【解决方案1】:

这完全取决于您如何处理图像。

如果您正在处理图像,您可以使用 NSUndoManager,您可以在其中跟踪图像处理。

否则,您可以跟踪对图像执行的一系列操作,这不是首选。

但这一切都取决于您的要求以及您如何处理图像,

需要注意的重要一点是您在此类操作中的记忆力。

如果您想在下次加载应用时重用您的操作,您可以使用 NSKeyArchiever。

【讨论】:

  • 不,我不想在下次加载时重复使用我的操作。 NSUndoManager 听起来是个不错的选择。我将开始探索这个......但我必须说,一旦对图像应用了一系列效果,就没有其他功能可以逐步取消效果。所以,据我了解,我必须为我应用的每个步骤管理一个缓冲区视图,对吧?如果我错了,请纠正我......但这可能会给记忆带来相当大的压力。
  • 您是否在修改后的图像上应用新效果/每个动作都使用原始图像?
  • @CrazyCreator:是的,效果是相互叠加的。第一步使用原始图像。
  • @user2041826 然后您可以将图像保存在存档中并对其进行序列化,这是我发现的最佳实践,当用户撤消操作时,只需加载图像并更新您的存档。希望这有效
  • 这听起来是个不错的概念。这个归档的概念对我来说是新的。您能否分享一个链接,我可以在其中找到更多相关信息?特别是应用于撤消重做时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2013-02-25
  • 2016-08-29
相关资源
最近更新 更多