NSPrintOperation附件视图中的NSScrollView无法正确滚动

时间:2018-03-05 16:17:32

标签: macos cocoa printing libdispatch

在我的应用程序开始打印之前,我必须做一些处理,所以我在一个帖子上做了,一旦完成,我就

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的常规有线PC鼠标滚动完美,但是使用Apple触控板(MacBook或外接一体机)和双指滚动,滚动视图不会更新,直到您将手指从触控板。

好像某些触摸移动的事件没有交付。

如果我将块中的最后一行从-runOperation更改为-runOperationModalForWindow:delegate:didRunSelector:contextInfo:,则可以再次滚动,但我没有真正有一个窗口我可以在我的用例中显示此表

如果我直接调用runOperation方法而不是执行我的线程,滚动视图会滚动得很好。

1 个答案:

答案 0 :(得分:1)

所以我有一个解决方法和怀疑:

  • 如果我使用-performSelectorOnMainThread:withObject:代替dispatch_async(),则滚动视图有效。

  • 我怀疑-performSelectorOnMainThread:withObject:并没有使用dispatch_async(),但滚轮滚动的触摸移动事件的传递确实​​如此。因此,当我-runOperation时,我会阻止主调度队列,并且那些事件堆积在后面"后面"我的模态运行循环。

虽然不太满意这种解决方法。什么保证-performSelectorOnMainThread:withObject:有一天也会阻止主队列?