如何在 Swift 中实现 NSDocument 方法 -canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo: ?

2023-11-21

在我的应用程序中,NSDocument子类关键任务硬件 - 用户真的不想意外关闭文档!所以,我已经实现了canCloseDocumentWithDelegate…显示一个NSAlert并在关门前询问。

我现在正在尝试在用 Swift 编写的应用程序中实现同样的事情。

由于答案是异步出现的,因此“应该关闭”结果将传递给委托上的回调,而不是简单地返回。在文档中-canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo:, 它说:

shouldCloseSelector 回调方法应具有以下签名:

- (void)document:(NSDocument *)doc shouldClose:(BOOL)shouldClose contextInfo:(void *)contextInfo

因此,由于有 3 个不同类型的参数,我不能使用简单的performSelector:withObject:样式方法——你必须使用 NSInitation。请注意,委托的类型是id,并且上面的签名不会出现在任何正式协议中——你不能简单地正常调用该方法。 (看这个邮件列表帖子例如应该如何完成此操作)

现在的问题是,Swift 中不允许 NSInitation!请参阅 Swift 博客“NSMethodSignature 发生了什么”:

将 Cocoa 框架引入 Swift 为我们提供了一个独特的机会,以全新的视角审视我们的 API。我们发现一些类与 Swift 的目标不符,通常是因为我们优先考虑安全性。例如,一些与动态方法调用相关的类在 Swift 中并未公开,即NSInvocation and NSMethodSignature.

这听起来像是一件好事,但当一个简单的事情发生时就会失败NSDocumentAPI 仍然需要 NSInitation!整个问题的真正解决方案是苹果推出新的canCloseDocument…使用块回调的 API。但在那之前,最好的解决方案是什么?


您可以使用一些低级运行时函数来解决此问题:

override func canCloseDocumentWithDelegate(delegate: AnyObject, shouldCloseSelector: Selector, contextInfo: UnsafeMutablePointer<Void>) {

    let allowed = true // ...or false. Add your logic here.

    let Class: AnyClass = object_getClass(delegate)
    let method = class_getMethodImplementation(Class, shouldCloseSelector)

    typealias signature = @convention(c) (AnyObject, Selector, AnyObject, Bool, UnsafeMutablePointer<Void>) -> Void
    let function = unsafeBitCast(method, signature.self)

    function(delegate, shouldCloseSelector, self, allowed, contextInfo)
}

如果您需要将此行为移至另一个方法(例如,在工作表获得用户确认后),只需将委托和 shouldCloseSelector 存储在属性中,以便稍后访问它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Swift 中实现 NSDocument 方法 -canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo: ? 的相关文章

  • iCloud Drive 内用户选择的文件夹内的垃圾文件

    我的应用程序可在任何用户选择的文件夹内处理用户 txt 文件 创建 更改 删 除 我只是在内部存储书签以访问用户选择的文件夹和文件 现在 在 macOS Catalina 中 当源文件夹位于 iCloud Drive 内时 系统仍然允许我创
  • 快速以编程方式打开 viewController

    我想通过代码在按钮上打开新的 UIViewController 我已经在故事板中制作了控制器 只想链接它 而且我不想使用 XIB 接口或 nibName 要打开新视图控制器 您需要在按钮单击事件中写入以下行 self performSegu
  • [UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:]

    我正在使用表格视图来显示消息 我使用了下面的代码 UIView chatView self bubbleView NSString stringWithFormat message from YES self chatArray addOb
  • 如何在 iPhone 中使用彩信发送音频?

    我瞪大了眼睛MMS在 iPhone 中 但我没有找到太多这方面的信息 大多数发现都与图像有关 我想使用发送音频MMS in iPhone using ios sdk 可以这样做吗 我有以下疑问MMS 如何识别所有MMS音频文件在iPhone
  • 为什么 CABasicAnimation 尝试初始化我的自定义 CALayer 的另一个实例?

    我收到此错误 致命错误 对类 MyProject AccordionLayer 使用未实现的初始化程序 init layer 使用以下代码 在我的视图控制器中 override func viewDidLoad let view self
  • 如何将一个 SwiftUI View 作为变量传递给另一个 View 结构

    我正在实施一个very自定义 NavigationLink 称为MenuItem并希望在整个项目中重用它 它是一个符合以下条件的结构体View并实施var body some View其中包含一个NavigationLink 我需要以某种方
  • Xcode 8:使用 iOS 9.3 基础 SDK 编译?

    我在 Xcode 8 0 beta 8S128d 中将 iOS 应用程序升级到 Swift 3 0 我以为一切都已准备就绪 并将其上传到 iTunes Connect 当我点击 提交审核 时 它给了我一个包含 26 个错误的列表 每个嵌入式
  • 符号化 iPad 崩溃日志后回溯仍然不可读

    我有这些崩溃日志 在我将它们放入管理器中后 会自动进行符号化 但结果始终相同 iOS 调用得到符号化 而我的应用程序调用则没有 我尝试将 Dym 和应用程序文件复制到同一文件夹中 删除并再次复制回来 没有任何帮助 知道发生了什么事吗 所以我
  • Swift 上的 USB 连接委托

    Swift 中是否有一个代表可以让我的班级知道何时通过计算机的 USB 插入新设备 我想知道我的程序何时可以使用新设备 Eric Aya 的答案已经相当不错了 但这里有一个 Swift 3 的改编 我把大部分丑陋的东西包裹在一个USBWat
  • 如何缩放曼德尔布罗集

    我已经成功实现了维基百科文章中所述的曼德尔布罗集 但我不知道如何放大特定部分 这是我正在使用的代码 void createSetWithWidth int width Height int height Thing void int int
  • 使用 JSONKit 解析 JSON 文件

    我正在构建一个音叉应用程序 货叉应允许最多 12 个预设节距 此外 我希望允许用户选择一个主题 每个主题都会加载一组预设 不必使用所有预设 我的配置文件看起来像这样 theme A3 comment An octave below conc
  • 在 macOS 上使用 Swift 3 从剪贴板读取

    我是 Swift 的初学者 我想弄清楚如何在 macOS Swift 3 上读取已复制到剪贴板的内容 我搜索了很多 但似乎找不到任何有效的东西 我从网上尝试过的一些事情 var pasteboardItems NSPasteboardIte
  • 无法在 xcode 8 beta 6 上编译 AWS CustomIdentityProvider

    我在 iOS 应用程序中使用 Amazon Cognito 和 Facebook 登录 直到 beta 5 为止此代码从这个SO线程 https stackoverflow com questions 37597388 aws cognit
  • 按升序对 NSDictionary 进行排序

    我正在尝试排序NSDictionary按升序排列 我正在使用这段代码 NSDictionary valDict self mGetDataDict key rowKey for NSString valueKey in valDict al
  • “无法取消归档名为 UITableViewController 的元素”

    我一直在按照 构建你的第二个 iOS 应用程序 教程一步步进行 在教程承诺所有错误都会消失之后 我遇到了这个错误 但直到其他错误都出现后 该错误才出现 全部更正 我尝试编译它 错误 The document MainStoryboard i
  • 使用 PDFOutline 将 TOC 添加到 Swift/Cocoa 中的 PDFDocument

    我正在开发一个小程序 将多个单页 PDF 合并到一个多页 PDF 中 我正在 Swift4 MacOS Cocoa 中工作 但我一生都无法在 Swift 中找到任何类型的示例来创建大纲 仅遍历现有的大纲 我对此非常熟悉 使用对文档的最佳猜测
  • 将 NSAttributedString 的子字符串替换为另一个 NSAttributedString

    我想替换一个子字符串 例如 replace of an NSAttributedString和另外一个NSAttributedString 我正在寻找一种等效的方法NSString s stringByReplacingOccurrence
  • 增加 iPhone 的推送通知徽章

    是否可以在收到通知时增加徽章值 或者我应该将计数作为有效负载发送吗 如果我每次都将徽章值发送为 1 那么如果应用程序未打开 我如何增加应用程序图标中的徽章值 我已经使用了这段代码 但不起作用 void application UIAppli
  • 找不到 Cocoa/Cocoa.h 文件

    我在用XMPPFramework在我的应用程序中 我已将 Cocoa Cocoa h 导入到我的 m 文件中 但是当我构建项目时Xcode显示错误 错误 未找到 Cocoa Cocoa h 文件 我该如何解决这个错误 如果您正在为 iOS
  • Facebook 登录打开错误的应用程序

    我正在尝试使用 facebook 实现应用程序的登录 但每次我尝试登录时 它都建议打开错误的应用程序 我尝试了一些在这里找到的东西 但没有成功 在 Facebook 的开发者页面上我添加了一个后缀 我的 plist 如下 有谁知道发生了什么

随机推荐

  • Java异常处理的良好实践[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我对 Java 中的异常处
  • 云代码 Parse.User.current() 返回 null

    当我在 Cloud Code 中使用此函数时Parse User current return null 我在用着parseExpressCookieSession用于登录 有什么建议吗 var express require expres
  • 3d 整数坐标的哈希函数

    拥有 3D 统一网格 为了节省大型模型中的内存 不需要保存空单元格 不与任何对象重叠的单元格 为此 我在 C 中使用字典 尽管性能已经下降 但这仍然比创建 3D 网格时出现异常要好 现在我的问题是找到一个快速哈希函数 将网格的 3d 整数坐
  • R 闪亮的日期滑块动画(按月)(当前按天)

    我对 R 比较满意 对 Shiny 则不太满意 尽管这不是我的第一个 Shiny 应用程序 我有一个数据框 其中包含经 纬度以及每个新客户进入系统的日期 时间 我还根据 startDate 变量创建了其他变量 例如年 月 周 年月 ym 和
  • Windows Python 版本和 VC++ 可再发行版本

    有人可以帮助填写此表 或链接到参考 以识别每个 Python 版本在 Windows 上构建的 VC Redistributable 版本 Windows Python 版本 动态链接库名称 VC 可再发行 链接到安装程序 2 4 msvc
  • _signInManager.GetExternalLoginInfoAsync() 始终返回带有打开 ID 的 null 到 azure 广告

    为什么signinmanager getexternallogininfoasync 方法总是返回null 我正在将 VS2015 与默认的 asp net core 不是框架 项目一起使用 用于具有个人用户帐户的 MVC 这是一个要求 使
  • 无法在 DLL“ComCtl32”中找到名为“TaskDialogIndirect”的入口点

    我们有一台特定的 Vista x64 机器 在运行我们的 C WinForms 应用程序时 显示以下错误 System EntryPointNotFoundException 无法找到名为的入口点 DLL 中的 TaskDialogIndi
  • A类不等于A类

    我们确实有一个缓存 Map 与 Class 的对象TestClass 另一个类加载器初始化 加载TestClass再次在运行时 所以下面的代码会抛出一个ClassCastException TestClass obj1 TestClass
  • 响应 JSON 对象还是 JSON.stringify?

    假设我想返回JSON内容 var content a foo b bar 返回 JSON 数据的最佳实践是什么 A 按原样返回对象 IEres end content B JSON stringify content 然后打电话JSON p
  • 将 JavaScript 'this' 转换为 jQuery '$(this)'

    请看一下下面的代码 div ul li li ul div
  • 如何直接将数组中的所有字符串大写?

    我学得很快 我一直在游乐场尝试这个 我不知道为什么这里的字符串没有大写 或者有没有其他方法可以直接将数组内的字符串大写 这是我的代码 var dogNames Sean fido Sarah Parker Walt abby Yang fo
  • 更好地解决多线程之谜?

    任务如下 我需要根据文件名锁定 最多可以有一百万个不同的文件名 这用于大规模基于磁盘的缓存 我想要低内存使用率和低查找时间 这意味着我需要一个 GC 锁定字典 字典中只能存在正在使用的锁 回调操作可能需要几分钟才能完成 因此全局锁定是不可接
  • 使用 jQuery 或纯 Javascript 访问 HTML 输入文本框数组

    我正在创建一个包含动态数量的输入文本框的表单 我希望每个文本框形成数组的一部分 理论上 这将使我更容易循环遍历它们 特别是因为我不知道最终存在的文本字段的数量 HTML 代码类似于 p Field 1 p
  • 具有自定义存储过程的 EF 6 代码优先

    我正在使用代码优先方法创建一个 MVC 5 应用程序 但我还在 SQL Server 数据库上创建了一些存储过程 有没有办法在创建数据库时在 C 中生成这些存储过程 也许通过执行sql 脚本 如果是这样我应该在哪里执行此操作 我会使用代码迁
  • 如何配置slurm通知邮件的内容?

    当某些类型的事件发生时 Slurm 可以使用以下选项通过电子邮件通知用户 mail type and mail user 我以这种方式收到的电子邮件包含一个空正文和一个如下所示的标题 SLURM Job id 9228 名称 toto 已结
  • 从 CSV 文件构建列表列表

    我有一个 Excel 文件 我将其导出为 csv 我想要解析该文件 但我在找到最佳方法时遇到了困难 csv 是我的网络中的计算机列表 以及每台计算机的本地管理员组中的帐户 我对元组做了类似的事情 但每台计算机的帐户数量范围从 1 到 30
  • 尝试将带有图像的表单发送到 PHP 服务器时 Android 中的内存泄漏

    我在这个文件中存在内存泄漏 我找不到确切的位置 但我认为是周围的图像 gt Bitmap bm BitmapFactory decodeFile filename 我尝试了很多不同的方法 但无法使其发挥作用 package prod veg
  • Python 多处理模块,Windows,通过创建新进程生成新的控制台窗口

    我对此做了一些研究 发现了一些类似的问题 但没有一个回答我真正想要的问题 我了解如何创建和使用流程multiprocessing模块 但是 当我创建一个新进程时 我想生成一个新的控制台窗口 仅用于该进程的使用 打印等 以便子进程不会共享父进
  • 在 WiX 中收获多个目录

    我正在尝试构建一个包含许多功能的安装程序 并且我正在使用heat收集每个功能的文件目录 我的源目录结构如下所示 HarvestDir FeatureA FeatureImpl dll FeatureImpl2 dll FeatureB Fe
  • 如何在 Swift 中实现 NSDocument 方法 -canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo: ?

    在我的应用程序中 NSDocument子类关键任务硬件 用户真的不想意外关闭文档 所以 我已经实现了canCloseDocumentWithDelegate 显示一个NSAlert并在关门前询问 我现在正在尝试在用 Swift 编写的应用程