如何在拖动操作期间显示模态窗口?

时间:2016-10-23 23:23:25

标签: swift macos cocoa drag-and-drop

在我的拖动操作的接收器的performDragOperation(sender: NSDraggingInfo)方法中,我想显示需要用户输入的模态窗口。删除的文件的URL将填充模态窗口中的一个字段,用户必须填充另一个NSTextField。

问题是模式窗口在拖动操作期间不响应键盘事件,这有效地导致死锁,直到拖动超时。我找不到一个可靠的方法来解决这个问题。我有两种可能的解决方法,但都没有解决这个问题:

  1. 使用dispatch_after()告诉主线程在拖动操作完成后0.25秒显示模态窗口。这有效,但取决于竞争条件。
  2. 只需显示常规窗口,而不是模态窗口。或者使用beginModalSession()。在这种情况下,比模态窗口更不可取。
  3. 代码:

    override func performDragOperation(sender: NSDraggingInfo) -> Bool {
        // Do some stuff here to get data from the sender
    
        // Load a view controller and display it modally
        let vc = MyViewController(nibName: "MyViewController", bundle: nil) {
            self.presentViewControllerAsModalWindow(vc)
        }
        return true
    }
    

    我尝试使用dispatch_async(dispatch_get_main_queue()) {}来呈现视图控制器。我认为这会允许performDragOperation返回true,但这似乎不足以完全结束拖动操作。

    我也试过从concludeDragOperation()显示视图控制器,但这也无济于事。

    处理这种情况的最佳做法是什么?

0 个答案:

没有答案