首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

重做不起作用(ios swift undoManager,调用)

重做不起作用(iOS Swift UndoManager 调用)

基础概念

UndoManager 是 iOS 开发中的一个类,用于管理撤销(undo)和重做(redo)操作。它允许用户在执行一系列操作后,能够撤销这些操作并恢复到之前的状态,或者重做已经撤销的操作。

相关优势

  1. 用户友好:提供撤销和重做功能,增强用户体验。
  2. 简化开发:开发者无需手动管理复杂的操作历史记录。
  3. 一致性:确保应用状态的一致性,避免因操作失误导致的数据丢失。

类型

UndoManager 主要有以下几种类型:

  • 默认 UndoManager:每个 NSDocument 对象都有一个默认的 UndoManager
  • 自定义 UndoManager:可以在需要的地方创建自定义的 UndoManager

应用场景

  • 文本编辑器:撤销和重做文本输入。
  • 图形编辑器:撤销和重做绘图操作。
  • 数据编辑器:撤销和重做数据修改操作。

可能遇到的问题及原因

问题:重做不起作用。

原因

  1. 未启用重做功能:可能未正确启用 UndoManager 的重做功能。
  2. 操作未注册:某些操作未正确注册到 UndoManager 中。
  3. 状态不一致:应用状态在撤销和重做过程中出现不一致。

解决方法

  1. 启用重做功能: 确保在初始化 UndoManager 时启用了重做功能。
  2. 启用重做功能: 确保在初始化 UndoManager 时启用了重做功能。
  3. 注册操作: 确保所有需要撤销和重做的操作都正确注册到 UndoManager 中。
  4. 注册操作: 确保所有需要撤销和重做的操作都正确注册到 UndoManager 中。
  5. 处理状态一致性: 确保在撤销和重做过程中,应用状态保持一致。
  6. 处理状态一致性: 确保在撤销和重做过程中,应用状态保持一致。

示例代码

以下是一个简单的示例,展示如何使用 UndoManager 实现撤销和重做功能:

代码语言:txt
复制
import UIKit

class ViewController: UIViewController {
    var undoManager = UndoManager()

    override func viewDidLoad() {
        super.viewDidLoad()
        // 初始化 UndoManager
        undoManager.levelsOfUndo = 10
    }

    @IBAction func addOperation(_ sender: UIButton) {
        let operation = MyOperation()
        undoManager.register(operation)
        // 执行操作
    }

    @IBAction func undo(_ sender: UIButton) {
        if undoManager.canUndo {
            undoManager.undo()
        }
    }

    @IBAction func redo(_ sender: UIButton) {
        if undoManager.canRedo {
            undoManager.redo()
        }
    }
}

class MyOperation: NSObject, Undoable {
    func undo() {
        // 撤销操作
    }

    func redo() {
        // 重做操作
    }
}

参考链接

UndoManager 官方文档

通过以上步骤,可以确保 UndoManager 的撤销和重做功能正常工作。如果问题仍然存在,请检查具体操作的实现细节,确保每个操作都正确注册和处理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS OC调用Swift

前提 目前TRTC官网上提供的一些场景化demo(比如TUIMeeting )是用的swift写的,下面以OC项目中集成TUIMeeting这个组件为例简单介绍下OC 调用swift 正文 1、集成TUIMeeting...组件直接参考TRTC官网文档https://cloud.tencent.com/document/product/647/45681 2、添加swift 文件,只要是混编无论是在oc项目中添加swift...文件的oc类中导入“项目名-Swift.h”文件,command+鼠标点击看是否能进到文件中 Finished running TRTCDemo on khiPhone.png 6、进不去“项目名-Swift.h...8、删除本地自己创建的“项目名-Swift.h”文件,再重复第5步进来就能看的你需要的“项目名-Swift.h”文件了 h TRTCDemo-Swift.h.png h TRTCDemo-Swift.h.png...然后就可以在OC类中导入“项目名-Swift.h”文件调swift文件了 最后 因为是以TUIMeeting为例,直接用pod集成的TUIMeeting组件中有些类如TRTCMeetingMainViewController

2.6K50

Swing 的 undo 包实现撤销重做功能

如果end已调用此电话为超。 否则,如果有编辑重做,这种回报从下一个显著的编辑将要恢复的价值。...比如,如果要在菜单中提供“撤消删除”,“重做删除”菜单项而不是简单的无所指的“撤消”,“重做”菜单项,可以通过这两个方法来获得。...2 使用undo包 1、创建UndoManager实例; 2、创建各种实现UndoableEdit的具体操作类; 3、调用某种操作时,创建一个具体操作类的实例,加入UndoManager; 4、在...Undo/Redo时,直接调用UndoManager的undo/redo方法。...4 调用Undo/Redo 在“撤消”按钮的事件处理器中,直接调用UndoManager的undo方法; 在“重做”按钮的事件处理器中,直接调用UndoManager的redo方法。

99020
  • 聊聊科技界发生的大事 WWDC

    除了外观其实我并不喜欢新版的图标设计大改之外,还重做了 Safari,可以方便的移植其他浏览器的插件。(这有什么用啊,只求你把兼容性做做好!!)还有一堆重做的 app,比如地图(??),信息。...基本没人会用的 app 都重做了。(这波操作有点迷) Apple Silicon 压箱底的 One more thing...,竟然是自研 arm 芯片成功应用到 Mac 平台。...app 这波血赚) Swift 虽然这部分没有在开幕场上提到,但是在之后的会议视频中具体聊到了这个。...这次的 Swift 与往年每年大改不同,而是重点升级了 SwiftUI,化繁为简的 SwiftUI 在此次开发者大会中的地位举足轻重,而苹果也是大力提倡使用 SwiftUI 进行开发。...可以说现在入门 Swift 是最佳时期。

    64420

    【初学者笔记】前端图表库 GoJs 入门

    选中节点后,使用 delete 按钮可以删除节点 按住 ctrl 键,滑动鼠标滚轮(或者 + - 号)可以进行整个图表的缩放,ctrl + 0 恢复初始大小 使用 ctrl+z,ctrl+y 可以进行撤回和重做操作...之后我们就可以通过 符号来调用它自身的一些属性、方法等。...false 禁止复制 allowCopy false 禁止删除 allowDelete false 禁止选中 allowSelect false 禁止缩放 allowZoom false 禁止撤销和重做...// 创建画布 this.diagram = $(go.Diagram, "diagram", { "undoManager.isEnabled": true, layout: $(...可以通过调用 Diagram.addDiagramListener 注册图表事件处理程序,各个图表事件以名字区分,也可以在图表初始化时调用 go.GraphObject.make 注册图事件处理程序。

    9.4K33

    开发者所需要知道的 iOS 10 SDK 新特性

    Xcode 8 中,同一个开发者帐号现在允许多个开发证书,而完全重做的 app 签名系统也足够好用,并且避免了误操作的可能性。...Swift 3 Swift 开源已经过去半年时间。在 Swift 2.2 中我们已经看到了开源的社区力量对语言产生的深刻影响,而在 Swift 3 中这一影响的效果将更加明显。...如果在当前你还能看出 Swift 和 Objective-C 在使用 Foundation 或者说开发 app 时同根同源的话,Swift 3 正式发布后可能情况会大不相同。...这在很多时候除了保证数据共享时的安全性以外,内部的引用特性也保证了调用速度。...关于 Swift 3 的更多内容,我会在我的《Swifter - 100 个 Swift 必备 tips》一书中通过补充章节的方式进行说明。

    93410

    干货 | 一波N折的携程酒店Swift-Objc混编实践

    说起Swift,对iOS开发者来说那是既熟悉又陌生,虽然早在2014年苹果就发布了Swift1.0版本,但在这之后的五六年时间里,一直处于不温不火的状态。...虽然从兼容性(仅限iOS13及以上)角度来看,他们的实用性还早,但这一系列动作已经展现出苹果公司对于Swift未来的决心,让人惊呼Swift的未来已来。...另外,在最近两年的校园招聘中,也有越来越多的学生表示他们已经直接从Swift开始学习iOS开发。 种种迹象表明,iOS开发语言的重心已经在悄悄倒向Swift,开发者们对Swift的信心正在被重新点燃。...根据之前的经验,我们很快就断定这是同一个原因,但是上文提过我们已经把Swift头文件copy到源文件目录中了,为什么突然不起作用了呢?...很显然是因为Swift模块间的互相调用跟Objc调用Swift不同,他们并不依赖那个编译出来的头文件。所以问题来了,Swift模块间是通过什么方式来对外暴露API的呢?

    1.4K31

    现今 Swift 包中的二进制目标

    文章目录 理解二进制在 Swift 中的演变 命令行工具相关 结论 在 iOS 和 macOS 开发中, Swift 包现在变得越来越重要。...这是 iOS 社区长期以来一直强烈要求的事情,例如格式化源代码、代码生成甚至收集公制代码库的指标。Swift 5.6 中所有这些所谓的 插件[10] 最终都需要调用可执行文件来执行特定任务。...这意味着如果要同时支持 M1 macs (arm64) 和 Linux arm64 机器,上面的胖二进制方法将不起作用 —— 请记住,二进制不能包含具有相同架构的多个切片。...结论 简而言之,我们可以总结 2022 年如何在 Swift 包中使用二进制文件的最佳实践,如下所示: 如果你需要为你的 iOS/macOS 项目添加预编译库或可执行文件,您应该使用 XCFramework...,并为每个用例(iOS 设备、macOS 设备和 iOS 模拟器)包含单独的二进制文件。

    1.9K20

    iOS开源界面布局库终于破3000star

    经过几年的打磨和多次的重构,我的iOS开源界面布局库MyLayout的star数量终于在2018年8月6号破3000了!有图为证: ? MyLayout 还有Swift版本TangramKit: ?...大家可以到这里去下载: OC版本MyLayout: https://github.com/youngsoft/MyLinearLayout Swift版本TangramKit: https://github.com...因为接触iOS开发比较早,所以早期基本都是用frame来进行界面布局,那时候也没有那么多的设备需要适配,所以用frame也还好。...现在的版本要求子视图的位置或者是否隐藏改变后需要调用 使用线性布局时里面的子视图的frame.origin.y是无效的,而是通过子视图的headMargin,tailMargin分别指出其距离他...默认是NO.如果设置为YES的话则边缘视图的边距不起作用了,而且子视图的weight也不起作用了。而且不是调整自己的大小了 //也就是当垂直方向则所有子视图按顺序排列在中间。

    1.9K40

    IOS开发高级系列】CoreData专题

    2,然后生成 NSManagedObjectContext 和 NSPersistentStoreCoordinator 对象,前者对用户透明地调用后者对数据文件进行读写。         ...当创建一个数据对象并插入 Managed Object Context 中,Managed Object Context 就开始跟踪这个数据对象的一切变动,并在合适的时候提供对 undo/redo 的支持,或调用...一般我们无需与它直接打交道来读写文件,Managed Object Context 在背后已经为我们调用 Persistent Store Coordinator 做了这部分工作。...                  (id result)in if result.finalResult {                  //TODO..     }          }         Swift...-8093461.html iOS CoreData应用升级需要注意的地方 http://www.oschina.net/question/565065_64657 iOS App升级安装- CoreData

    59550

    Swift开发React Native组件

    混编 众所周知RN是用OC编写的,那如何才能是用Swift来编写RN的组件呢,答案就是IOS原生就支持OC和Swift混编应用。...这个文件主要的功能是将OC的文件接口放在一起然后供Swift文件调用,红圈标注出来的意思是如果你想自己手动创建一个bridge文件也是可以的,但是需要做相应的配置。...在OC中调用Swift 首先我们定义一个Swift类,定义一个sayHello函数,如果它被调用的话,控制台会打印出Hello, Swift日志。...在OC中调用Swift时,应注意两点: Swift中的 @objc(MySwift)这个关键字是Xode定义的,它在编译的时候将Swift文件也转换成OC文件,所以它最后才能以OC的代码格式执行。...在Swift调用OC 我们定义一个OC类,首先创建头文件 Myoc.h。

    2.9K90

    27.Swift学习之与OC混编

    在目前iOS开发语言从Objective-C到Swift的过渡时期,开发中难免会碰到两种语言同时存在的情况,如果在同一个项目中,两种语言并存,那么该项目就是一个混合项目。...Apple给我们做好了“桥接”工作,但是在Objective-C的项目中调用Swift与在Swift项目中调用Objective-C,处理的方式是不一样的,下面来进行一个简单的介绍。...一、Objective-C的项目中调用Swift 新建一个Objective-C的iOS项目 创建一个Swift的类,继承自NSObject,这时候会有如下的提示,此时选择Create Bridging...Header文件,该头文件是自动生成的并且对开发者透明 在Swift代码中将需要暴露给OC调用的属性和方法前加上 @objc修饰符,关于这个内容可查看之前的博文 class Person: NSObject...项目中调用Objective-C 新建一个SwiftiOS项目 创建一个Objective-C的类,此时也会有如一中的文字提示,修改类文件如下: @interface Person : NSObject

    1.2K10

    Swift 周报 第三十六期

    但全局变量可以从任何地方访问,所以这些工具不起作用。...讨论[在 "super.init" 调用之前使用的 "self" 与 "在 super.init 调用时未初始化属性" 冲突](https://forums.swift.org/t/self-used-before-super-init-call-conflicts-with-property-not-initialized-at-super-init-call...如果常规代码在 Swift 外部调用(包括所有 I/O)或跨任务同步(调用异步函数),则类析构器将不会跨这些边界重新排序。...iOS 防 dump 可行性调研报告[11] 摘要: 文章介绍了如何防止 iOS App 被 dump ,包括代码混淆、加密、完整性检查等多层防御策略,以及服务器端验证、动态加载、API 安全性和多因素认证等方案...10] 掌握 StoreKit2: https://swiftwithmajid.com/2023/08/01/mastering-storekit2 [11] iOS 防 dump 可行性调研报告:

    22820

    iOS10 Swift3.0 XCode 8 总结

    1,iOS10 新增的privacy settings iOS10添加了新的权限控制范围 如果你尝试访问这些隐私数据时得到如下错误: > This app has crashed because it...layoutIfNeed iOS10 在一个控件上调用layoutIfNeed是只会单独计算约束,它所约束的控件不会生效,想要达到之前的效果需要在父级控件上调用layoutIfNeed 4, NSDate...Swift3.0会将oc的NSDate转为Data类型,有些操作NSDate的第三方库会闪退 5, Notification Swift3.0字符串类型的通知常量被定义为struct static...UIStatusBarStyleDefault; } 11, iOS10 UICollectionView 性能优化 在iOS10 UICollectionView 最大的改变是增加了Pre-Fetching...允许关键字作为参数标签 Swift3.0开始我们将能使用除inout var let关键字作为参数标签 // Swift 3 calling with argument label: calculateRevenue

    79110

    Swift 周报 第三十三期

    周报精选 新闻和社区:App 内购买项目和订阅即将实行价格与税率调整 提案:将 conformance 宏作为 extension 宏 Swift 论坛:讨论 \ 和 $ 的意义 推荐博文:轻量化的 iOS...讨论NSLock.Lock 加 Await 加 NSLock.Unlock 导致主线程冻结[5] 提问: 以下代码模拟了当外部库的作者引入锁时的情况,这可能包含等待调用。...有什么办法可以防止这种情况 noasync 注释不是解决方案,因为: 1)如果函数包装在另一个没有 noasync 注释的函数中,它不起作用;2)第三方库的作者可能会忘记添加这样的注释。...更好的设计是使用一个函数来获取锁,调用回调,然后在回调返回后释放锁。 (理想情况下,该函数还可以提供对受锁保护的资源的回调访问,否则将无法访问。).../66115 [8] 轻量化的 iOS 动画框架实现: https://juejin.cn/post/7252586606091419708/ [9] 使用 Swift Package 插件将自定义字体加载到您的应用程序中

    33920

    SVGEdit:老牌开源 SVG 编辑器是如何架构的?

    LeftPanel 类初始化后会调用 init 方法。 该方法会: 读取前面的 HTML 创建一个 template 元素,然后添加 DOM 树中。 给一些 DOM 元素绑定了事件响应函数。...LeftPanel 的 init 方法是在 EditorStartUp 类(这个是 Editor 的父类)的 init 方法中被调用的。...操作的历史记录 我以前的文章说过,历史记录需要维护一个撤销栈和一个重做栈。 两个栈等价于一个数组或双向链表中,加上一个指针,该指针指向多个命令中的当前命令。...撤销就是把指向往左移动,重做往右移,新操作则把指针后面的命令丢掉,然后把这个新的操作加到数组中,并将指针后移。...SVGEdit 的历史命令都保存在 UndoManager 类的 undoStack 数组中,并用 undoStackPointer 指针指向最新命令的位置。

    72430

    grpc-swift入门

    不想看前面的屁话,要直接上代码的,请跳到「iOS App端如何实现和RPC服务器通信」章节 什么是RPC、gRPC、grpc-swift 要搞清楚什么是grpc-swift, 就要先搞清楚什么是gRPC...但是,现在大家都用Swift开发iOS App,所以就有了grpc-swift了。...上面介绍了,我们客户端这边,调用了sayHello()方法,同样地,到时候我们的App,也会调用这个方法,获取数据,而这个方法自然是用Swift语言写的,我们需要自己写这个方法吗?答案是不需要。...比如iOSSwift、Android的Kotlin等等。 (上面说过的「gRPC支持多种语言」,就是这个意思。)...新建一个iOS工程,获取gRPC Swift:可以用Swift Package Manager;可以手动导入;也可以用CocoaPods。详情可以看Github仓库的README。

    1.2K20
    领券