Программно перейти от SwiftUI к UITabBarController - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть существующее приложение, которое я хочу заменить существующим встроенным UIKit на тот, который я написал в SwiftUI. Я успешно использовал v c = UIHostingController (rootView: mySwiftUIView ()) и self.window.rootViewController = v c в моем AppDelegate, чтобы загрузить его при первом запуске приложения. Итак, у меня работает часть UIKit to SwiftUI.

В конце установки SwiftUI у меня есть кнопка, которую я хочу использовать для перехода к основному приложению V C. Одним из вариантов является использование следующего:

sheet(isPresented: $initialVCPresented) {
                    VCSwiftUIView(storyboard: "Main", VC: "RootVC")
                }

с, ...

//
//  VCSwiftUIView.swift
//
//  Created by Schumacher, Dan on 2/12/20.
//  Copyright © 2020 Schumacher, Dan. All rights reserved.
//

import SwiftUI
import UIKit

struct VCSwiftUIView: UIViewControllerRepresentable {
    let storyboard: String
    let VC: String

  func makeUIViewController(context: UIViewControllerRepresentableContext<VCSwiftUIView>) -> AnimatedTabBarController {

    //Load the storyboard
    let loadedStoryboard = UIStoryboard(name: storyboard, bundle: nil)

    //Load the ViewController
     return loadedStoryboard.instantiateViewController(withIdentifier: VC) as! AnimatedTabBarController
  }

  func updateUIViewController(_ uiViewController: AnimatedTabBarController, context: UIViewControllerRepresentableContext<VCSwiftUIView>) {
  }
}

Но это показывает UIKit V C модально, который я не хотеть.

Я не верю, что могу использовать NavigationLink (назначение: MainV C)), поскольку MainV C не является контроллером навигации.

Может кто-нибудь предложить мне какие-либо предложения о том, как перейти от моего представления SwiftUI к UITabBarContoller?

ОБНОВЛЕНИЕ:

Я попробовал следующий код в действии для моей кнопки SwiftUI. Я вижу, что UIKit TabBarV C вызывается (RootV C на раскадровке указывает на UITabBarViewController) через операторы печати в консоли, и экран мигает, но SwiftUI View остается на экране. Есть идеи, почему UIKit V C не отображается?

let window:UIWindow = UIWindow()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let rootVC: UIViewController = storyboard.instantiateViewController(withIdentifier: "RootVC")
window.rootViewController = rootVC
window.makeKeyAndVisible()

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Спасибо за помощь и руководство. Решение было довольно простым, когда я получил ваши предложения. Я просто создал VStack внутри ZStack и установил непрозрачность до 0,0, пока кнопка не была нажата, тогда как я установил непрозрачность до 1,0 и до 0,0 для предыдущего VStack. Действие кнопки - просто обновить исходную переменную логического состояния V C.

            VStack {
                VCSwiftUIView(storyboard: "Main", VC: "RootVC")
            }
            .opacity(initialVCPresented ? 1.0 : 0.0)
            .animation(Animation.easeOut(duration: 2.0))

И код для VCSwiftUIView не отличается от кода, показанного в исходном вопросе.

0 голосов
/ 13 февраля 2020

Лист конечно показывает модал. Вам разрешено использовать NavigationLink, как показано ниже ... Назначением навигации может быть Любой просмотр Swift UI . Это не обязательно должен быть навигационный контроллер

struct ContentView: View {
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: VCSwiftUIView()) {
                    Text("Show VC Swift UI View")
                }.navigationBarTitle("Animated Tab Bar")
            }
        }
    }
}
...