场景:
我有一个简单的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)
,该方法在调用时会提供一个safari控制器,该控制器允许用户登录Twitter。但是,要调用authorize
,您需要传入一个符合SFSafariViewControllerDelegate
的控制器。根据我目前的基本理解,SwiftUI的View
类型不是视图控制器,而且由于它是一个结构,因此不符合SFSafariViewControllerDelegate
。
我查看了来自Apples网站的Interfacing with UIKit教程,他们似乎创建了UIViewControllerRepresentable
类型,然后从View
类型返回了{{1} body
中的}。这使他们可以使用UIKit中的PageViewController。但是,这不完全是我拥有或需要的用例。我只需要能够以某种方式将我简单的View
转换为View
。 UIViewController
会在这里使用吗?如果是,将如何注入此依赖关系,或者视图应该知道/使用控制器?
大多数我的困惑在于尚不了解SwiftUI的最佳实践。 UIHostingController
类型似乎替代了UIKit中View
的使用,但是当与UIKit接口时,转换如何工作?
如果有人有任何想法或想讨论这个问题,我将不胜感激!谢谢。
答案 0 :(得分:1)
我很确定有解决此问题的更好方法,但是您可能会从以下内容中学到灵感。
只是给您一些背景信息。我正在创建一个快速的原型来实施Uber授权,并实现了这样的目标:
//
// ContentView.swift
//
// Created by Daniel Tello on 05/11/19.
// Copyright © 2019 Daniel Tello. All rights reserved.
//
import SwiftUI
import UberCore
struct ContentView: View {
var body: some View {
VStack {
Button(action: uberLogin) {
Text("Uber")
}
}
}
}
func uberLogin() {
let scopes: [UberScope] = [.profile, .places, .request]
let presentingView = UIApplication.shared.windows.last?.rootViewController
let loginManager = LoginManager(loginType: .native)
loginManager.login(requestedScopes: scopes, presentingViewController: presentingView) { (accessToken, error) -> () in
if accessToken != nil {
NSLog("Got an AccessToken!")
} else {
// Error
if let error = error {
NSLog(error.localizedDescription)
} else {
NSLog("An Unknown Error Occured")
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}