- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我第一次尝试使用基于 NSDocument 的应用程序。(Xcode 9.2、Swift 4、macOS 10.12 Sierra 和 Cocoa/AppKit)
我想知道在没有自动保存的情况下实现关闭文档的正确方法。你能告诉我关闭 NSDocument 的最佳实践吗?
当用户试图关闭文档时,将调用以下 NSDocument 方法。
canClose(withDelegate:shouldClose:contextInfo:)
我调试参数并找到以下内容:
delegate = MyApp.Document
shouldCloseSelector = _something:didSomething:soContinue:
contextInfo = libsystem_blocks.dylib `_NSConcreteMallocBlock
显然这样的选择器不可用,所以我认为可以在此处更改为:
override func canClose(withDelegate delegate: Any,
shouldClose shouldCloseSelector: Selector?,
contextInfo: UnsafeMutableRawPointer?) {
let delegate : Any = self
let shouldCloseSelector : Selector = #selector(Document.document(_:shouldClose:contextInfo:))
super.canClose(withDelegate: delegate, shouldClose: shouldCloseSelector, contextInfo: contextInfo)
}
@objc func document(_ document : NSDocument, shouldClose flag : Bool,
contextInfo: UnsafeMutableRawPointer?) {
if document === self, flag {
self.cleanup() // my cleanup method
self.close() // NSDocument.close()
}
}
deinit {
Swift.print(#function, #line)
}
这似乎可行,但我想这不是正确的方法,因为忽略了原始参数 (Selector/contextInfo)。
最佳答案
我找到了解决方案。我希望这会对某人有所帮助。
private var closingBlock : ((Bool) -> Void)? = nil
override func canClose(withDelegate delegate: Any,
shouldClose shouldCloseSelector: Selector?,
contextInfo: UnsafeMutableRawPointer?) {
let obj : AnyObject = delegate as AnyObject
let Class : AnyClass = object_getClass(delegate)!
let method = class_getMethodImplementation(Class, shouldCloseSelector!)
typealias signature =
@convention(c) (AnyObject, Selector, AnyObject, Bool, UnsafeMutableRawPointer?) -> Void
let function = unsafeBitCast(method, to: signature.self)
self.closingBlock = {[unowned obj, shouldCloseSelector, contextInfo] (flag) -> Void in
function(obj, shouldCloseSelector!, self, flag, contextInfo)
}
let delegate : Any = self
let shouldCloseSelector : Selector = #selector(Document.document(_:shouldClose:contextInfo:))
super.canClose(withDelegate: delegate, shouldClose: shouldCloseSelector, contextInfo: contextInfo)
}
@objc func document(_ document : NSDocument, shouldClose flag : Bool,
contextInfo: UnsafeMutableRawPointer?) {
if flag {
self.cleanup() // my cleanup method
}
self.closingBlock?(flag)
self.closingBlock = nil
}
override func close() {
Swift.print(#function, #line, #file)
super.close()
}
deinit {
Swift.print(#function, #line, #file)
}
https://developer.apple.com/library/content/releasenotes/AppKit/RN-AppKitOlderNotes/
Advice for Overriders of Methods that Follow the delegate:didSomethingSelector:contextInfo: Pattern
Shows how to implement the NSDocument method -canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo: using Swift. Must use Objective-C to perform an NSInvocation.
关于swift - 实现 canClose 的最佳实践(withDelegate :shouldClose:contextInfo:),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49343307/
谢谢您的阅读,这是我的问题。 我正在尝试保存图片(使用UIImagePickerController方法拍摄的图片),但是出现错误。错误为“不响应选择器图像:didFinishSavingWithEr
我需要将带有几个选项的 NSDictionary 传递给 NSAlert - (void)beginSheetModalForWindow:(NSWindow *)window modalDelega
我第一次尝试使用基于 NSDocument 的应用程序。(Xcode 9.2、Swift 4、macOS 10.12 Sierra 和 Cocoa/AppKit) 我想知道在没有自动保存的情况下实现关
这个问题的答案可能很简单,但目前我很困惑,欢迎任何帮助。 我已将上下文菜单附加到表格 View 。菜单选项之一是删除 TableView 中的元素。我正在使用 NSAlert 弹出模式窗口以确认删除。
当用户点击默认按钮时,我从下面的警报表代码中收到以下错误: -[NSRectSet objectForKey:]: unrecognized selector sent to instance 0x4
我有一个 UITableView。当点击一个单元格时,我的应用程序会生成相关图像。图像生成是在后台线程上完成的,因为一些图像需要相当长的时间来渲染。渲染图像后,将在主线程上调用 UIImageWrit
我目前使用 Postman 应用程序来尝试各种 Sharepoint Api。 要检索 RequestDigest,我知道必须对/_api/contextinfo 进行 api 调用,Body 中没有
在我的应用程序中,NSDocument 子类任务关键型硬件 - 用户真的不想意外关闭文档!因此,我实现了 canCloseDocumentWithDelegate... 以显示 NSAlert 并在关
在我的应用程序中,NSDocument 子类关键任务硬件——用户真的不想意外关闭文档!所以,我实现了 canCloseDocumentWithDelegate... 以显示 NSAlert 并在关闭前
考虑这个 ARC 代码: - (void)main { NSString *s = [[NSString alloc] initWithString:@"s"]; [NSApp beg
我是一名优秀的程序员,十分优秀!