微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI不一致的行为从SwiftUI视图“推送”到UIKit ViewController

如何解决SwiftUI不一致的行为从SwiftUI视图“推送”到UIKit ViewController

我正在现有的UIKit App中实现一些SwiftUI视图。 DashboardView(如下)是主屏幕,然后我需要推送到现有的UIKit ViewControllers。我正在尝试将视图控制器推到导航堆栈上(即使用后退按钮,而不是模态)。下面的代码,“显示更多”按钮下的推动按预期的方式使用后退按钮推动到SkateListViewController,但是WorkoutListView中的推动将视图控制器呈现为模态?它与嵌入到父视图中的WorkoutListView有关系吗?

struct DashboardView: View {
    var body: some View {
        ScrollView {
                vstack(spacing: 7.0) {
                    HStack {
                        Text("Workouts")
                            .font(.custom(futuraBold,size: largeTitleTextSize))
                            .padding(.leading)
                        Spacer()
                        
                        Button(action: {
                        
                            let storyBoard: UIStoryboard =  UIStoryboard(name: "Version3",bundle: nil)
                            let skateListTVC = storyBoard.instantiateViewController(withIdentifier: "skateListVC") as! SkateListTableViewController
                            UIApplication.topViewController()?.navigationController?.pushViewController(skateListTVC,animated: true) //This line works as expected and pushes onto Nav Stack with back button
                        }) {
                            Text("Show More")
                              .font(.custom(futuraMedium,size: headlineTextSize))
                                .foregroundColor(Color.blue)
                        }
                    }
                    ZStack {
                        vstack(alignment: .leading) {
                            WorkoutListView(workouts: [MockWorkout().getMockWorkout()])
                        }
                        .padding(.horizontal)
                    }
                }
               }
          }
    }    
}


struct WorkoutListView: View {
    
    @State var workouts: [HKWorkout]
    
    var body: some View {
        vstack(alignment: .leading) {
                ForEach(workouts) { workout in
                    WorkoutRow(workout: workout)
                        .onTapGesture {
                            SelectedWorkoutSingleton.sharedInstance.selectedWorkout = workout
                            let storyBoard: UIStoryboard =  UIStoryboard(name: "Version3",bundle: nil)
                                let skateDetailHostingControllerView = storyBoard.instantiateViewController(withIdentifier: "skateDetailHostingController") as! SkateDetailHostingController
                                 UIApplication.topViewController()?.navigationController?.pushViewController(skateDetailHostingControllerView,animated: true) //This line shows Hosting Controller as Modal,doesn't push
                           
                        }
                }
        }
    }
}

解决方法

为什么不使用NavigationLink,然后推送到您的视图。首先,创建该UIViewControllerRepresentable。

struct SkateDetailWrapper: UIViewControllerRepresentable {
    typealias UIViewControllerType = SkateDetailHostingController
    
    func makeUIViewController(context: Context) -> SkateDetailHostingController {
        let storyBoard: UIStoryboard =  UIStoryboard(name: "Version3",bundle: nil)
        let skateDetailHostingControllerView = storyBoard.instantiateViewController(withIdentifier: "skateDetailHostingController") as! SkateDetailHostingController
        return skateDetailHostingControllerView
    }
    
    func updateUIViewController(_ uiViewController: SkateDetailHostingController,context: Context) {
    }
}

然后使用NavigationLink将其推送:

ForEach(workouts,id:\.self) { workout in
    
    NavigationLink(destination: SkateDetailWrapper()) {
        WorkoutRow(workout: workout)
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。