У меня проблемы с анимацией некоторых подклассов неопределенных NSProgressIndicator
. Они начинают и останавливают анимацию без каких-либо проблем. Однако, если я сворачиваю окно во время анимации, вызывается stopAnimation:
/StopAnimation(NSObject sender)
, что имеет смысл для экономии ресурсов, если окно не видно. Я предполагаю, что это вызывается из самой структуры какао, глядя на трассировку стека.
Проблема то возникает при восстановлении окна, анимация не возобновляется.
Я видел, что вы можете использовать NSCoding Protocol
и может переопределить encodeWithEncoder:
/ EncodeTo(NSCoder encoder)
для сохранения некоторого состояния, а затем использовать это сохраненное состояние в initWithCoder:
/ AppProgressIndicatorBar(NSCoder coder)
для возобновления работы. Но вот проблема была в том, что мой encodeWithEncoder:
/EncodeTo(NSCoder encoder)
так и не позвонили.
Глядя на этот SO вопрос и answer, он должен обрабатываться автоматически, если объект необходимо сериализовать. Так что я не уверен, почему это не называется.
В том же ответе говорится, что вы можете сделать это явно с помощью NSKeyedArchiver
, но тогда мне нужно будет слушать с помощью NSWindowDelegate
, чтобы знать, когда окно сворачивается/восстанавливается. В этом случае я мог бы просто использовать это и не использовать протокол NSCoding...
Это просто кажется грязным, и я полагаю, что это очень распространенный сценарий. Итак, как вы должны возобновить анимацию? Я новичок в какао, в основном работаю с .NET, и я думаю, что эта проблема является признаком моих ограниченных знаний о какао.
Я использую Xamarin Mac и пытался дать сигнатуры методов Objective-C и C#. Я буду рад найти решение в любом из них, я смогу (надеюсь!) преобразовать его в эквивалент С#.
Для полноты вот мой текущий подкласс Xamarin Mac, использующий протокол NSCoder, где 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);
...
}
...
}