ios - 上下文菜单阻止拖放到新窗口中

标签 ios uitableview drag-and-drop ipados uiscene

这款 iPadOS/iOS 13 应用程序实现了多个窗口和拖放功能。几乎在所有情况下,两者都能完美工作。

我们在实现 UITableViewDelegate 的上下文菜单方法的 TableView 中遇到唯一的问题。

- tableView:contextMenuConfigurationForRowAtIndexPath:point:Beta
- tableView:willPerformPreviewActionForMenuWithConfiguration:animator:Beta

如果我们在上下文菜单出现之前启动拖动,那么我们可以通过将项目移动到屏幕边缘来成功地将其拖动到新窗口 (UIScene) 中。但是,如果我们在上下文菜单出现后启动拖动,则无法将项目拖动到新窗口或场景中。

有谁知道问题的根源是什么?

以下两个对比视频展示了该问题:

失败

This is the drag and drop failing.

成功

This is the drag and drop succeeding.

最佳答案

已识别的问题

viewDidAppear:中,我们执行了以下操作:

UISceneActivationConditions *conditions = self.view.window.windowScene.activationConditions;
conditions.prefersToActivateForTargetContentIdentifierPredicate = [NSPredicate predicateWithFormat:@"self == %@", self.note.noteID];
conditions.canActivateForTargetContentIdentifierPredicate = [NSPredicate predicateWithFormat:@"self == %@", self.note.noteID];

显示上下文菜单时,调用 viewDidAppear: 并将 .activationConditions 应用于当前 UIScene。

请注意,上下文菜单的预览 View Controller 与拖放项共享 NSUserActivity 详细信息,因此我们尝试拖动的 NSUserActivity 的 .targetContentIdentifier.activationConditions 匹配 当前 UIScene 的谓词。因此,当显示上下文菜单的预览 View Controller 时,我们告诉系统当前的 UIScene 是拖动事件的最佳接收者,防止其他新窗口接收它(至少,这是我的假设)。

(虽然我不同意这种行为,但这似乎是 iOS 13.1.3 中 UIScene 激活条件的解释方式。)

解决方案

为了解决这个问题,我只是在上下文菜单中显示 View Controller 时阻止了 .activationConditions 的配置。

这是一个更新的视频,显示了成功的拖放操作,即使显示了上下文菜单: Successfully using drag and drop with Context Menu

关于ios - 上下文菜单阻止拖放到新窗口中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58571568/

相关文章:

ios - 无法更改 UINavigationBar 颜色(快速)

iphone - 在应用程序内部使用 SQLite 数据库的最佳方式

ios - 如何在 iOS 中设置为按钮选择的图像选择器图像

ios - SceneKit SCNNode 跟随触摸移动

javascript - Dojo 拖放 "list in list"(嵌套列表)

swift - searchBar过滤的tableViewCells didSelectItemAt indexPath显示在navigationBar标题中

iphone - 在 Xcode 中使用 AutoLayout 会禁用我的代码(动态地)工作?

ios - 获取数组A与数组B交点的反面

c# - IDataObject 拖放问题,从 __ComObject 转换

google-chrome - GWT native 拖放 : no data in DragOverHandler