上下文菜单块将拖放到新窗口中

时间:2019-10-26 14:15:10

标签: ios uitableview drag-and-drop ipados uiscene

此iPadOS / iOS 13应用程序同时实现了多个窗口和拖放功能。在几乎每种情况下,两者都可以正常工作。

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

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

如果我们在 之前启动拖动,则可以将其移动到屏幕边缘,从而将其成功拖动到新窗口(UIScene)中。但是,如果我们在 之后启动拖动,则上下文菜单出现后,就不可能将该项拖动到新窗口或场景中。

有人知道问题的根源吗?

以下是两个对比录像,展示了该问题:

失败

This is the drag and drop failing.

成功

This is the drag and drop succeeding.

1 个答案:

答案 0 :(得分:0)

已确定的问题

12:22:35.922 [main] DEBUG example.SomeClass - This is some debug! (This should appear in console) 12:22:35.923 [main] INFO example.SomeClass - Here's some info! (This should appear in console) 12:22:35.923 [main] ERROR example.SomeClass - Some error happened! (We will also see this in the console) 12:22:35.924 [main] FATAL example.SomeClass - This will appear since it's more specific than ERROR level. 中,我们执行以下操作:

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:应用于当前的UIScene。

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

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

解决方案

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

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