2

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

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

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

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

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

以下是展示问题的两个对比视频:

失败

这是拖放失败。

成功

这是拖放成功。

4

1 回答 1

2

已确定的问题

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。

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

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

解决方案

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

这是一个显示成功拖放 的更新视频,即使显示了上下文菜单:使用上下文菜单成功使用拖放

于 2019-10-26T17:25:13.227 回答