问题标签 [uihostingcontroller]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
198 浏览

ios - 在 viewDidAppear 之前翻译 superview 时,UIHostingController 视图的转换不同步

给定: UIHostingController 托管在 UIKit 超级视图中。

时间:在 viewDidAppear 之前修改了 Superview 变换。在这个例子中,下降了 200 点。

然后:对superview变换的后续更改将不同步。在此示例中,我将其移回其原始位置。虽然 SwiftUI 内容似乎在正确的位置,但点击注册仍然在原始位置,所以为了点击,我需要点击它正在显示的区域下方。(见截图

Xcode 12.3 - iPhone 8 Sim (iOS 14)

对于我一直在构建的需要与基于 UIKit 的容器(例如:底部工作表)交互的组件库来说,这是一个巨大的交易破坏者。

更新:

我已经通过他们的反馈助手联系了苹果,但还没有回复。我的一位同事找到了一个似乎可以解决问题的解决方法,但我们不知道它为什么会起作用:

0 投票
0 回答
165 浏览

swiftui - 将 UIWindow.rootView 转换为 UIHostingController其中有环境变量

将 UIWindow.rootView 转换为托管控制器,例如:

工作正常,除非它有environmentObjects.

由于 myMainTabView已被初始化.environmentObject,因此我无法将其强制转换为UIHostingController<MainTabView>.

当我尝试 printrootView的类型时,Xcode 告诉:

我想是:

但我无法到达_EnvironmentKeyWritingModifier

有人有想法吗?

0 投票
2 回答
1388 浏览

ios - Swift UI:UIHostingController.view 不适合 iOS 13 的内容视图大小

iOS 13 iOS 14

我想根据通讯结果更新 Swift UI View。但是 UIHostingController.view 不适合 iOS 13 的 rootView 大小。当我尝试使用下面的示例代码时,也会发生同样的事情。我想将自调整大小的 SwiftUI 视图添加到 UIStackView,但是由于这个问题,SwiftUI 视图与上一个和下一个视图重叠。我怎样才能避免这个问题?

如果像下面这样 addSubview 到 UIStackView,iOS13 中 Swift UI View 的高度不会改变。 在此处输入图像描述

iOS13(不正确) 在此处输入图像描述

iOS14(正确) 在此处输入图像描述

0 投票
2 回答
625 浏览

ios - 如何从 SwiftUI View 导航回 UIViewController?

我在所有视图中都使用 SwiftUI 1.0,从 MainView 开始,MainView 是除登录之外的主屏幕,因为我使用的是通过 UIKit 制作的客户端 LoginSDK。

因此,在 LoginViewController 中,我可以使用以下代码在成功登录时推送 MainView():

在 MainView 中,我尝试实现一个注销方法,当用户使用以下代码单击注销按钮时,该方法将 LoginViewController 设置为 rootView:

上面的注销方法实现什么也没做。我想知道如何从 MainView(一个 SwiftUI 结构)导航回 LoginViewController(一个 UIKit UIViewController)。

0 投票
1 回答
800 浏览

ios - 如何检查视图控制器是否属于 UIHostingController 类型

我有一个 UIHostingController 托管一个名为 CatalogView 的 SwiftUI 视图。显示它时,附加了一个环境对象,所以基本上从 UIKit 显示它是这样的:

现在稍后我需要检查这个 UIHostingController 是否在 navigationController.viewControllers 列表中

type(of:) 显示以下内容,哪种有意义:

诸如 vc.self 是 UIHostingController.Type 或 vc.self 是 UIHostingController< CatalogView >.Type 之类的东西都返回 false (vc 是 navigationController.viewControllers 的一个元素

以下显然有效,它返回 true,但是 UIHostingController 初始化中的任何更改都会更改其类型

如何检查视图控制器是否属于 UIHostingController 类型?或者至少我怎样才能将控制器转换为 UIHostingController 以便我可以检查它的 rootview?

0 投票
0 回答
197 浏览

uiview - 来自 UIHostingController 的 SwiftUI:显示 ActionSheet 会发出有关分离视图控制器的警告

我创建了一个 SwiftUI 视图,它显示在 MKMapView 的注释标注中。我使用 UIHostingController 来包装 SwiftUI 视图,并使用 annotationView 的detailCalloutAccessoryView属性来设置视图并显示它。这在大多数情况下都可以正常工作。然后我在 SwiftUI 视图中添加了一些按钮,点击这些按钮时需要显示警报或操作表。

这是代码:

当我点击按钮时,它可以正常工作并显示一个操作表,但会在控制台中生成此警告:

[演示] 不鼓励从分离的视图控制器 < TtGC7SwiftUI19UIHostingControllerVS_7AnyView : 0x7fac1fac8280> 呈现视图控制器 <SwiftUI.PlatformAlertController: 0x7fac118b3a00>。

解决此警告的最佳方法是什么?如果它托管在 UIHostingController 中,我是否应该在 SwiftUI 视图中显示警报或 ActionSheet?还是我应该以其他方式这样做?

0 投票
1 回答
112 浏览

swift - SwiftUI:将视图信息传递给 UIKit

我有一个 UIKit 和 AppKit 应用程序,我正在通过 UIHostingController / NSHostingController 在其中显示一个 SwiftUI 视图。视图上有一些按钮,我想将点击事件传回 UIKit/AppKit 视图控制器,以从被点击的按钮显示 UIAlertController(我更喜欢在 SwiftUI 中使用 ActionSheet,但它不支持苹果系统)。我通过宿主控制器将委托传递到 SwiftUI 视图中,并使用它来回调 UIKit/AppKit 视图。但是要显示 UIAlertController(甚至UIActivityViewController),我需要从 SwiftUI 视图中获取有关sourceView和的一些信息sourceRect,否则它可能会在 iPad 上崩溃。

如何将这些信息从 SwiftUI 视图传递回 UIKit/Appkit 应用程序?我想这sourceView可能是显示的 SwiftUI 视图,但是我如何读取(并传回)被点击的 SwiftUI 按钮的矩形?

0 投票
0 回答
329 浏览

uiview - 将 SwiftUI 视图添加到 UIView 子视图,无需访问父 UIViewController

我已经看到了许多关于如何使用容器视图将 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?

0 投票
1 回答
339 浏览

swift - 如何在现有 Storyboard Tab Bar Controller 中使用 Hosting Controller for SwiftUI?

我正在尝试使用托管控制器将 SwiftUI 视图包含在现有的故事板标签栏控制器中。我已经使用Relationship Segue 将Hosting View Controller 连接到Storyboard 上的Tab Bar Controller。以下是我从阅读其他帖子中尝试过的,但我得到的只是黑屏。任何帮助,将不胜感激。谢谢你。

在此处输入图像描述

0 投票
1 回答
349 浏览

swiftui - UIHostingController 是否必须在视图控制器层次结构中?

我想在我的基于 UIKit 的 UI 中嵌入一些 SwiftUI,不幸的是 Apple 不提供UIHostingView, 只有UIHostingController. 我可以或多或少地忽略该控制器并只使用它的视图,还是我真的需要将它添加为子视图控制器?如果我不这样做会怎样?

问题是在某些情况下找到父视图控制器可能很困难。UIView本身对视图控制器一无所知,所以我必须想出自己的方法来跟踪哪个是“当前”视图控制器。除非确实有必要,否则我宁愿不这样做。

到目前为止,在我的实验中,它运行良好,无需添加UIHostingController作为孩子。设备旋转得到适当处理,SwiftUI 的暗模式覆盖 ( .colorScheme()) 甚至可以通过嵌入工作。