在我的应用程序可以开始打印之前,我必须做一些处理,所以我在线程上执行,一旦完成,我就执行
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)之外,所有的工作都很正常。
与苹果电脑连接的普通有线PC鼠标可以完美地滚动该视图,但如果使用苹果触控板(包括MacBook和外置鼠标),并使用双指滚动,滚动视图就不会更新,除非你将手指从触控板上移开。
看起来好像某种触动的事件并没有被传递。
如果我将块中的最后一行从-runOperation更改为-runOperationModalForWindow:delegate:didRunSelector:contextInfo:,滚动也可以,但我实际上没有一个窗口,我可以在我的用例中显示这个工作表。
如果我直接调用这两个runOperation方法中的任何一个,而不是执行线程操作,滚动视图就会正常滚动。
发布于 2018-03-06 00:17:32
所以我有一个变通办法和一个怀疑:
因此,当我运行时,我阻塞了主分派队列,这些事件堆积在我的模式运行循环“后面”。
不过,对这个变通方法并不是很满意。如何保证-performSelectorOnMainThread:withObject:有朝一日不会阻塞主队列?
https://stackoverflow.com/questions/49114863
复制相似问题