3

场景:

我有一个简单的 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. 从我目前的基本理解来看View,SwiftUI 中的类型不是视图控制器,而且SFSafariViewControllerDelegate由于它是结构体,因此不符合。

我查看了Apples 网站上的与 UIKit 接口教程,他们似乎创建了一个UIViewControllerRepresentable类型,然后从View类型中返回这个“控制器bodyView。这允许他们使用 UIKit 中的 PageViewController。但是,这并不完全是我拥有或需要的用例。我只需要能够以某种方式将我的简单View转换为UIViewController. 将是在这里使用的东西,如果UIHostingController是这样,如何注入这种依赖关系,或者视图是否应该知道/使用控制器?

我的困惑主要在于还不知道 SwiftUI 的最佳实践是什么。该View类型似乎取代了UIViewControllerUIKit 中的使用,但是当与 UIKit 交互时,转换是如何工作的呢?

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

4

1 回答 1

2

我很确定有更好的方法来解决这个问题,但是您可能会从以下内容中获得灵感。

只是给你一些背景。我正在创建一个快速原型来实现优步授权,我是这样实现的:

//
//  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()
    }
}

于 2019-11-12T03:18:09.867 回答