1

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

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 方法而不是进行线程化,则滚动视图滚动良好。

4

1 回答 1

1

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

  • 如果我使用-performSelectorOnMainThread:withObject:而不是dispatch_async(),滚动视图有效。

  • 我怀疑这-performSelectorOnMainThread:withObject:不会dispatch_async()在引擎盖下使用,但是为滚轮滚动传递触摸移动事件确实如此。因此,当我-runOperation阻塞主调度队列时,这些事件堆积在我的模态运行循环“后面”。

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

于 2018-03-05T16:17:32.393 回答