【发布时间】:2019-06-07 00:43:39
【问题描述】:
场景:
我有一个简单的 SwiftUI 视图,如下所示:
struct AuthView: View {
var body: some View {
VStack {
Button(action: handleLogin) {
Text("Login to twitter")
}
}
}
private func handleLogin() {
// do login stuff here
}
}
现在,理想情况下,在 handleLogin 函数中,我只需执行 OAuth 请求并处理登录等。但是,我正在使用我在 GitHub 上找到的库来进行演示。
这个库有一个方法authorize(callBackUrl: URL, presentingController: UIViewController),当被调用时会显示一个允许用户登录到twitter的safari控制器。但是,要调用authorize,您需要传入一个符合SFSafariViewControllerDelegate 的控制器。从我目前的基本理解来看,SwiftUI 中的View 类型不是视图控制器,而且由于它是一个结构,因此不能符合SFSafariViewControllerDelegate。
我查看了 Apples 网站上的 Interfacing with UIKit 教程,他们似乎创建了一个 UIViewControllerRepresentable 类型,然后从 View 类型返回此“控制器”在 body 的 View 中。这允许他们使用 UIKit 中的 PageViewController。但是,这并不完全是我拥有或需要的用例。我只需要能够以某种方式将我的简单View 转换为UIViewController。 UIHostingController 会在这里使用吗?如果是,如何注入这种依赖关系,或者视图是否应该知道/使用控制器?
我的困惑主要在于还不知道 SwiftUI 的最佳实践是什么。 View 类型似乎取代了 UIKit 中 UIViewController 的使用,但是在与 UIKit 接口时转换是如何工作的呢?
如果有人有任何想法或想讨论这个问题,我将不胜感激!谢谢。
【问题讨论】:
-
可能这是你正在使用的库需要更改的情况;它需要
UIViewController还是需要SFSafariViewControllerDelegate?当它只需要后者时,却要求前者符合后者,这可能是一个糟糕的设计。