NSWindow类中有一个名为isVisible的计算(computed)属性,我正在创建一个自定义NSWindow,我将其命名为MyNSWindow,所以我想查看MyNSWindow的值isVisible的变化,例如,在窗口显示在屏幕上之前,值应该为FALSE,之后值应该为TRUE,所以我想观察这个值的变化,我该怎么做呢?我也是not,正在寻找与联合的答案.

这是我的代码:

import Cocoa

class AppDelegate: NSObject, NSApplicationDelegate {
    
    private var window: NSWindow!
    
    func applicationDidFinishLaunching(_ aNotification: Notification) {

        window = MyNSWindow(
            contentRect: NSRect(x: 0, y: 0, width: 100.0, height: 100.0),
            styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
            backing: .buffered, defer: false)
        
        window.setFrameAutosaveName("Main Window")
        window.title = "No Storyboard Window"
        window.makeKeyAndOrderFront(window)
        window.center()
        
    }

}


class MyNSWindow: NSWindow {
    
 
    
}

推荐答案

苹果已经让窗口变得可见或隐藏时很难可靠地得到通知.我为自己的项目做了一些调查,以下是我的发现:

  • 苹果推荐的解决方案是将Windows的contentViewController设置为NSViewController.重写视图控制器的viewWillAppearviewDidAppear方法,以便在窗口变为可见时得到通知.重写当窗口变为隐藏时要通知的视图控制器的viewWillDisappearviewDidDisappear的方法.

    我知道这是苹果推荐的解决方案,因为我在2016年打开了一个要求公开windowWillShow通知的反馈,结果被告知:

    我们更现代的方法是使用带有View控制器的情节串连图板;ContentViewController将获得一个view WillEmerar-这是您现在应该使用的钩子.

    据我所知,从非常有限的测试,这个方法是可靠的,所以它可能对你很有效.我有一个现有的应用程序,其中许多窗口都是在没有contentViewController个窗口的情况下实现的,我不希望对其进行 retrofit ,所以这对我来说不是很好.此外,您只能将其应用于您创建的窗口,而不能应用于由NSAlert创建的窗口.

  • visible不符合KVO.

  • visiblefalse更改为true时,没有发布记录在案的通知.

  • visibletrue更改为false时,NSWindow.willCloseNotification应该被发布,但当以工作表显示的窗口被取消时,它不会被发布.

  • 应该可以使用Cocoa Bindings绑定到visible(使用NSVisibleBinding常量),但当以工作表形式呈现的窗口被取消时,绑定不会更新.它的实施也很烦人和晦涩难懂.

  • 您不能在NSWindow上重写要通知的单个公共"漏斗"方法.orderOut(_:)orderFront(_:)orderBack(_:)方法会经历order(_:relativeTo:),但orderFrontRegardless()不会.表单演示和解雇确实要经过order(_:relativeTo:),所以如果你从来不使用orderFrontRegardless(),那么让NSWindow取代order(_:relativeTo:)对你来说可能是一个很好的解决方案.但是,您不会收到AppKit为您创建的窗口的出现和消失的通知,例如由NSAlert创建的窗口.如果您创建任何NSPanel,您还需要创建一个NSPanel子类.

  • 当窗口更改可见性时,AppKit会发布一些未记录的通知,即使是在工作表演示和解雇时也会可靠地发布.其中两个被命名为_NSWindowWillBecomeVisibleNSWindowWillOrderOffScreenNotification.使用风险自负.

Swift相关问答推荐

为什么Swift在某些链调用中不能对不可变值使用变异成员,而在其他链调用中则不能使用变异成员?

如何更新Square Order?

";async let和";async之间的差异让我们等待";

不使用`lockFocus`将两个重叠的NSImage转换为单个NSImage

Swift:iVar + Equatable上的协议约束

Swift C外部实现的Task / Future类类型

如何将CodingKeys作为数组而不是枚举传递到类外部的函数中?

SwiftData/PersistentModel.swft:540:致命错误:不支持的关系密钥路径ReferenceWritableKeyPath

如何在SwiftUI 4+(iOS 16+)中使用新的NavigationStack进行导航

在 RealmSwift 中表示范围值?

macOS 的窗口框架中使用的真实类型和真实类型是什么?

MacOS KIND 是如何实现的

格式化大货币数字

如果 Swift 无法分配内存会怎样?

如何使用带有 span 样式标签的 Swift XMLParser

单击按钮后的计时器发布者初始化计时器

故事板未在助手中显示视图控制器

如何快速判断设备方向是横向还是横向?

用 UIBezierPath 画一条线

如何快速识别字符串中的大写和小写字符?