在 window 最小化然后恢复后恢复 NSProgressIndicator 动画

Resume NSProgressIndicator animation after window minimised and then restored

我在处理某些子类不确定 NSProgressIndicator 的动画时遇到了问题。他们开始和停止动画没有任何问题。但是,如果我在设置动画时最小化 window,则会调用 stopAnimation: / StopAnimation(NSObject sender),如果 window 不可见,这样可以节省资源。我假设这是从查看堆栈跟踪的 cocoa 框架本身调用的。

然后问题就出现了window恢复的时候,动画没有恢复。

我看到你可以使用 NSCoding Protocol 并且可以覆盖 encodeWithEncoder: / EncodeTo(NSCoder encoder) 来保存一些状态,然后在 initWithCoder: / AppProgressIndicatorBar(NSCoder coder) 继续。但这里的问题是我的 encodeWithEncoder: / EncodeTo(NSCoder encoder) 从未被调用过。

看这个SOquestion and answer,如果对象需要序列化,应该会自动处理。所以我不确定为什么它没有被调用。

同样的答案说你可以用 NSKeyedArchiver 明确地做到这一点,但是我需要用 NSWindowDelegate 来听,以了解 window 何时正在最小化/恢复。在这种情况下,我可以只使用它,而不使用 NSCoding 协议...

这感觉很脏,我想这是一个很常见的场景。那么你应该/如何恢复动画呢?我是 cocoa 的新手,主要来自 .NET 背景,我认为这个问题是我 cocoa 知识有限的症状。

我正在使用 Xamarin Mac,并尝试提供 Objective-C 和 C# 方法签名。我很乐意在任何一个中找到解决方案,我将能够(希望如此!)将其转换为 C# 等价物。

为了完整起见,这是我当前使用 NSCoder 协议的 Xamarin Mac 子类,其中 EncodeTo 未被调用。我是 运行 OS X 10.11.3 和 Xamarin Studio 5.10.2。

[Register("AppProgressIndicatorBar")]
public class AppProgressIndicatorBar : NSProgressIndicator, INSCoding
{

   ...

    public AppProgressIndicatorBar(NSCoder coder) : base(coder)
    {
        ...
    }

    ...

    public override void EncodeTo(NSCoder encoder)
    {
        base.EncodeTo(encoder);

        ...
    }

    ...
}

您应该可以使用 NSWindowWillMiniaturizeNotificationNSWindowDidMiniaturizeNotificationNSWindowDidDeminiaturizeNotification 通知或 windowWillMiniaturize:windowDidMiniaturize:windowDidDeminiaturize: Window 委托方法来跟踪 window 的状态并在 window 去微型化时恢复进度条的状态(这真的是一个词吗?)。

HTH