【问题标题】:Xcode macos swift screensaver: configSheet doesn't show up on first clickXcode macos swift屏幕保护程序:configSheet在第一次点击时不显示
【发布时间】:2020-08-10 17:54:41
【问题描述】:

我正在尝试使用加载 xib 选项页面的 configurationSheet 创建一个快速的 macOS 屏幕保护程序。 不幸的是,选项页面仅在单击“屏幕保护程序选项...”按钮两次后才会显示。第一次单击按钮时,控制台应用程序显示:

-[LegacyExtensionManager exceptionHandler:shouldHandleException:mask:] -- Module: ScreenSaverS threw an uncaught exception: NSInternalInconsistencyException, reason: cannot begin sheet a second time.
-[LegacyExtensionManager processExtensionRequest:replyInfo:]_block_invoke -- Module: ScreenSaverS (ScreenSaverS) failed to display a configuration sheet. Exception: NSInternalInconsistencyException, reason: cannot begin sheet a second time

在此之后,内部选项页面似乎已被删除,并且第二次单击选项按钮时,我的 xib 加载器以及完整的选项页面操作都正常工作。 这是我的配置表重载:

    override var configureSheet: NSWindow?
        {
            NSLog("ScreenSaverS:configureSheet self=%p", self);

            if (configSheet == nil)
            {
                let tmpBundle = Bundle(for: type(of: self));
                if (tmpBundle.loadNibNamed("ConfigView", owner: self, topLevelObjects: nil) == false)
                {
                    NSLog("ScreenSaverS:configureSheet load config sheet failed");
                } else {
                    NSLog("ScreenSaverS:configureSheet config sheet loaded configSheet=%p", configSheet);
                }
            } else {
                NSLog("ScreenSaverS:configureSheet self=%p already created", self);
            }

            return configSheet
        }

有谁知道为什么第一次单击选项按钮会导致此异常以及如何解决此问题以使其第一次正常工作?

【问题讨论】:

    标签: swift xcode exception screensaver


    【解决方案1】:

    当你加载你的笔尖时,你传递的是owner: self,这应该是你工作表的控制器。

    我建议像这样为您的工作表控制器创建一个单独的类:

    class ConfigureSheetController : NSObject {
        
        @IBOutlet var window: NSWindow?
        @IBOutlet var canvasColorWell: NSColorWell!
    
        override init() {
            super.init()
            let myBundle = Bundle(for: ConfigureSheetController.self)
            myBundle.loadNibNamed("ConfigureSheet", owner: self, topLevelObjects: nil)
        }
        // ...
    

    然后在 ScreenSaverView 中你可以简单地做:

        lazy var sheetController: ConfigureSheetController = ConfigureSheetController()
    
        // ...
    
        override var hasConfigureSheet: Bool {
            return true
        }
        
        override var configureSheet: NSWindow? {
            return sheetController.window
        }
    

    您可以在此处找到一个完整的 Swift 屏幕保护程序的最小示例:https://github.com/glouel/ScreenSaverMinimal

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-04
      • 2015-08-29
      • 1970-01-01
      • 2015-09-02
      • 2011-08-13
      • 1970-01-01
      • 2019-10-11
      • 2016-07-17
      相关资源
      最近更新 更多