Я пишу пользовательский интерфейс Cocoa и вызываю NSView's scrollRectToVisible
в течение короткого промежутка времени в результате того, что пользователь удерживает определенный ключ (и, следовательно, повторно запускает события на основная очередь).Как избежать асинхронного характера scrollToVisibleRect, вызывающего периодические проблемы с синхронизацией
Через каротаж я вижу, что следующие события keyDown()
срабатывают до scrollRectToVisible
, завершив предварительную замену visibleRect
. Это приводит к тому, что последующий scrollRectToVisible
вызывается с неправильными входами (а именно с неправильным запуском visibleRect) и ведет к нечувствительному поведению пользовательского интерфейса. Это происходит примерно в 50% случаев, которые, как я полагаю, следует ожидать, связанные с асинхронной проблемой.
Как я могу обратиться к этому вопросу?
Один из способов, которым я могу представить, - как-то превратить scrollRectToVisible
в синхронный вызов. Проблема в том, что это API AppKit, и метод немедленно возвращается с логическим указанием, будет ли он прокручиваться или нет.
Вы используете собственный 'NSTimer' для управления вызовами? – mikeD
@mikeD Нет. Каждое последующее событие 'keyDown()' запускает 'scrollRectToVisible' последовательным образом. События 'keyDown()' запускаются буквально, просто удерживая один ключ на клавиатуре. – Sam
Вы пытались переопределить метод NSView '- keyDown:' на ваш взгляд? – mikeD