SwiftUI和UIKit与旧版API中的UIViewController要求接口

时间:2019-06-07 00:43:39

标签: ios swift swiftui xcode11

场景:

我有一个简单的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转换为ViewUIViewController会在这里使用吗?如果是,将如何注入此依赖关系,或者视图应该知道/使用控制器?

大多数我的困惑在于尚不了解SwiftUI的最佳实践。 UIHostingController类型似乎替代了UIKit中View的使用,但是当与UIKit接口时,转换如何工作?

如果有人有任何想法或想讨论这个问题,我将不胜感激!谢谢。

1 个答案:

答案 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()
    }
}