NSScrollView в дополнительном представлении NSPrintOperation не прокручивается должным образом

Мне нужно немного обработать, прежде чем мое приложение сможет начать печать, поэтому я делаю это в потоке, а когда все готово, я делаю

dispatch_async(dispatch_get_main_queue(),^(){
    ULIPrintableView *viewForPrinting = [[ULIPrintableView alloc] initWithData:data];
    NSPrintOperation *operation = [NSPrintOperation printOperationWithView:viewForPrinting];
    NSPrintPanel *panel = operation.printPanel;
    ULIPrintAccessoryViewController *settingsVC = [ULIPrintAccessoryViewController new];
    viewForPrinting.printOperation = operation;
    settingsVC.printView = viewForPrinting;
    [panel addAccessoryController:settingsVC];
    [operation runOperation];
});

Все работает нормально, за исключением того, что для NSScrollView (обертывание NSTableView) в дополнительном представлении.

Этот вид отлично прокручивается с помощью обычной проводной мыши ПК, подключенной к Mac, но с трекпадом Apple (как MacBook, так и внешним) и прокруткой двумя пальцами вид прокрутки не обновляется, пока вы не уберете пальцы с трекпада.

Кажется, что какие-то события, перемещаемые касанием, не были доставлены.

Если я изменю последнюю строку в блоке с -runOperation на -runOperationModalForWindow:delegate:didRunSelector:contextInfo:, прокрутка снова будет в порядке, но на самом деле у меня нет окна, в котором я мог бы показать этот лист в моем случае использования.

Если я вызываю любой метод runOperation напрямую, вместо того, чтобы выполнять потоки, прокрутка прокручивается нормально.


person uliwitness    schedule 05.03.2018    source источник


Ответы (1)


Итак, у меня есть обходной путь и подозрение:

  • Если я использую -performSelectorOnMainThread:withObject: вместо dispatch_async(), прокрутка будет работать.

  • Я подозреваю, что -performSelectorOnMainThread:withObject: не использует dispatch_async() под капотом, но эта доставка событий, перемещаемых касанием, для прокрутки колеса делает. Поэтому, когда я -runOperation, я блокирую основную очередь отправки, и эти события накапливаются «за» моим модальным циклом выполнения.

Однако не очень доволен этим обходным путем. Какие гарантии, что -performSelectorOnMainThread:withObject: когда-нибудь не заблокирует и основную очередь?

person uliwitness    schedule 05.03.2018