1

我已经看到了许多关于如何使用容器视图将 SwiftUI 视图添加到 UIKit 视图中的示例,这些示例假设您可以访问UIViewControllerUIKit 端的父级。我有一个无法做到的情况;具体来说,我想向 MKAnnotationView 添加一个 SwiftUI 视图detailCalloutAccessoryView,我只有一个 UIView 可以附加到,但UIViewControllerUIKit 中没有父级。在这种情况下我该怎么办?

环顾四周时,我发现了一个(看似)令人信服的答案:https ://github.com/khuffie/swiftui-mapkit-callout

在此解决方案中,您从头开始创建一个 UIView,然后使用 SwiftUI 视图创建一个 UIHostingController,并将 UIHostingController 添加view到顶级 UIView(具有自动布局约束),并且只需返回顶级 UIView,无需执行任何操作带有容器视图(如 call didMoveToParentView)。它的工作原理是它在 annotationView 标注内正确显示 SwiftUI 视图。但是当地图被拖动时,标注视图似乎随之移动(UIHostingView来自视图调试器),但底层的 SwiftUI 视图实际上并没有随之移动,所以如果你在那个 SwiftUI 视图上有按钮,你可以不要在它们出现的地方点击它们。

这有点奇怪。这就是我在视图调试器中看到的......首先,选择了“HostingView”:

选择了托管视图的查看调试器

然后选择实际的 SwiftUI 视图(它不会显示在屏幕上,但它是所有子视图和点击目标所在的位置):

选择了 SwiftUI 视图的视图调试器

顺便说一句,可以使用存储库本身的示例代码来复制它。当您运行示例应用程序时,打开标注按钮,然后拖动地图,然后使用视图调试器对其进行检查。

我在存储库中为此创建了一个问题:https ://github.com/khuffie/swiftui-mapkit-callout/issues/1

我想知道这个问题是否因为 UIHostingController 没有被添加到任何父视图控制器而发生?这是一个在这里没有得到满足的硬性要求,还是可以以其他方式工作?我可以尝试其他解决方案吗?我试过在没有 SwiftUI 的情况下这样做,使用 Interface Builder 制作一个带有子视图的 UIView,上面有按钮,并且该视图按预期正常运行,所以我猜 UIKit 和 SwiftUI 之间的接口有些东西搞砸了。有没有更好的方法来设置这种情况,我们无法访问 UIKit 端的 UIViewController?

4

0 回答 0