SwiftUI и UIKit взаимодействуют с требованиями UIViewController в старых API - PullRequest
1 голос
/ 07 июня 2019

Сценарий:

У меня есть простое представление 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, который позволяет пользователю войти в твиттер. Однако для вызова authorize вам нужно передать контроллер, соответствующий SFSafariViewControllerDelegate. Из моего текущего базового понимания является то, что тип View из SwiftUI не является контроллером представления и, более того, не может соответствовать SFSafariViewControllerDelegate, так как это структура.

Я посмотрел учебник Взаимодействие с UIKit с сайта Apple, и они, похоже, создают тип UIViewControllerRepresentable, а затем из типа View возвращают этот "контроллер" в body из View. Это позволяет им использовать PageViewController из UIKit. Тем не менее, это не совсем тот случай использования, который мне нужен или нужен. Мне просто нужно иметь возможность каким-то образом преобразовать мой простой View в UIViewController. Будет ли UIHostingController использоваться здесь, и если да, то как эта зависимость будет внедрена, или представление должно даже знать / использовать контроллер?

Главным образом мое замешательство заключается в том, что я еще не знаю, каковы лучшие практики SwiftUI. Тип View, кажется, заменяет использование UIViewController в UIKit, но тогда как конвертация работает при взаимодействии с UIKit?

Если у кого-то есть идеи или они хотели бы обсудить это, я был бы признателен! Спасибо.

...