首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >旧API中的SwiftUI和UIKit与UIViewController要求的接口

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

Stack Overflow用户
提问于 2019-06-07 08:43:40
回答 1查看 1.6K关注 0票数 3

场景:

我有一个简单的SwiftUI视图,如下所示:

代码语言:javascript
复制
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,因为它是一个结构。

我看过来自苹果网站的Interfacing with UIKit教程,他们似乎创建了一个UIViewControllerRepresentable类型,然后从View类型在Viewbody中返回这个“控制器”。这允许他们从UIKit使用PageViewController。然而,这并不完全是我所拥有或需要的用例。我只需要能够以某种方式将我的简单View转换为UIViewControllerUIHostingController是这里要用的东西吗?如果是这样的话,这种依赖是如何注入的,或者视图是否应该知道/使用控制器?

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

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

EN

回答 1

Stack Overflow用户

发布于 2019-11-12 11:18:10

我很确定有更好的方法来解决这个问题,但你可能会从下面的文章中获得灵感。

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

代码语言:javascript
复制
//
//  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()
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56486695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档