ios 在基于UIKit/Storyboard的应用程序中调整SwiftUI类流程

ubbxdtey  于 9个月前  发布在  iOS
关注(0)|答案(1)|浏览(133)

我在SwiftUI示例中有以下流程,非常方便。它基本上检查UserDefaults中的一个标志,看之前是否显示过介绍视图,并根据它加载ContentViewIntroView。一旦显示了IntroView,用户点击IntroView,它会自动切换回ContentView。这是SwiftUI中的一个很好的功能,其中App结构体会观察bool并重新计算WindowGroup

问题:我有一个基于故事板的现有UIKit应用程序,我正在使用UIHostingController慢慢地将SwiftUI视图注入其中。但我并没有真正获得SwiftUI应用程序生命周期的好处,就像上面一样,它变得很麻烦。例如,在显示IntroView之后,我可能需要显示另一个视图,如PermissionsView,在那里我要求相机和照片库权限,用户可以随时在iOS设置中更改。在SwiftUI中,下面的代码会自动监视任何更改并弹出IntroViewPermissionsView。我如何在基于UIKit的应用程序中做到这一点?是否可以将UIApplicationDelegateSceneDelegate代码迁移到SwiftUI App,同时仍然从Storyboard加载视图控制器?

@main
struct TestSwiftUIIntroViewsApp: App {

   @AppStorage("showedIntroView") var showedIntroView: Bool = false

   var body: some Scene {
      WindowGroup {
         if showedIntroView {
             ContentView()
         } else {
             IntroView()
         }
     }
   }
 }

struct ContentView: View {
   var body: some View {
       VStack {
           Text("Content View")
       }
       .padding()
   }
 }

struct IntroView: View {

    @AppStorage("showedIntroView") var showedIntroView: Bool = false

    var body: some View {
      VStack(alignment: .center, content: {
         Text("Intro View")
      })
     .onTapGesture {
        showedIntroView = true
      }
    }

字符串
}

hm2xizp9

hm2xizp91#

我不知道我是否正确,但是是的,你可以加载故事板视图或任何UIViewController视图,这样做:

struct MyView: UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> MyViewController {
        // For Storyboard views
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let viewController = storyboard.instantiateViewController(withIdentifier: "MyViewController") as! MyViewController
        // For manually created UIViewControllers
        /*
        let vc = MyAwesomeViewController()
        return vc
        */
        return viewController
    }

    func updateUIViewController(_ uiViewController: MyViewController, context: Context) {
        // Update the view controller here
    }
}

字符串
然后你可以像使用SwiftUI视图一样使用上面的代码:

struct ContentView: View {
    var body: some View {
        MyView()
    }
}


另外,我不知道你的应用有多老,但对我来说似乎很新,但在SwiftUI应用中使用AppDelegate(甚至在SceneDelegate之前)是常见的做法。如果你想在SwiftUI应用中使用AppDelegate或现有的AppDelegate,你可以在SwiftUI项目中将其声明为符合App的结构体,如下所示:

@UIApplicationDelegateAdaptor(MyAppDelegate.self) var appDelegate


它应该像在UIKit中一样工作。我希望我至少能部分地帮助你。祝你编码愉快!

相关问题