如何判断NSWindow是否用于文档版本浏览器UI右侧的版本展示?
判断OS X版本浏览器中窗口是否展示旧版本内容的方法
要区分版本浏览器里的主编辑窗口(左侧)和旧版本预览窗口(右侧堆叠),可以通过以下几种可靠的方式:
方法1:检查NSDocument的version属性
在OS X 10.7及以上系统中,NSDocument提供了version属性:
- 主窗口(左侧)的文档:
document.version为nil(因为它是当前正在编辑的版本) - 旧版本预览窗口(右侧)的文档:
document.version会返回对应的NSDocumentVersion实例,代表该窗口展示的历史版本
你可以在代码中这样判断:
if (document.version != nil) { // 这个窗口展示的是旧版本内容 } else { // 这是主编辑窗口(左侧) }
方法2:利用窗口通知与文档状态结合
虽然你已经知道主窗口会收到进入/退出版本浏览的通知,但可以结合文档的isBrowsingVersions属性和窗口的关系来判断:
- 主窗口的文档调用
isBrowsingVersions返回YES - 旧版本预览窗口的文档调用
isBrowsingVersions返回NO,因为它们是独立的快照文档,不属于正在浏览版本的主文档上下文
代码示例:
if (![document isBrowsingVersions] && [NSDocumentController sharedDocumentController].versionBrowser != nil) { // 当前窗口是版本浏览器中的旧版本预览窗口 }
方法3:检查文档的文件路径(备选方案)
旧版本的快照文档会被存储在系统的版本管理目录中(通常是 ~/Library/Application Support/com.apple.versioner/ 下的子目录),你可以通过文档的fileURL来判断:
NSURL *fileURL = document.fileURL; NSString *versionerPath = @"~/Library/Application Support/com.apple.versioner/"; if ([fileURL.path hasPrefix:[versionerPath stringByExpandingTildeInPath]]) { // 该窗口展示的是旧版本内容 }
注意:这个方法依赖系统目录结构,未来可能有变化,建议优先使用前两种方法。
另外,如果你需要监听窗口是否成为旧版本预览窗口,可以结合NSWindowDidBecomeMainNotification通知,在通知回调中检查上述条件。
内容的提问来源于stack exchange,提问作者Jesse Grosjean
相关产品推荐
相关产品推荐

