此iPadOS / iOS 13应用程序同时实现了多个窗口和拖放功能。在几乎每种情况下,两者都可以正常工作。
在实现UITableViewDelegate的上下文菜单方法的表视图中,我们遇到唯一的问题。
- tableView:contextMenuConfigurationForRowAtIndexPath:point:Beta
- tableView:willPerformPreviewActionForMenuWithConfiguration:animator:Beta
如果我们在 之前启动拖动,则可以将其移动到屏幕边缘,从而将其成功拖动到新窗口(UIScene)中。但是,如果我们在 之后启动拖动,则上下文菜单出现后,就不可能将该项拖动到新窗口或场景中。
有人知道问题的根源吗?
以下是两个对比录像,展示了该问题:
失败
成功
答案 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
的配置。