SwiftUI UIPageView编译错误和操作表问题

SwiftUI UIPageView编译错误和操作表问题,swiftui,uipageviewcontroller,uialertsheet,Swiftui,Uipageviewcontroller,Uialertsheet,我的代码中有两个问题 一个是编译错误[无法将类型为“Page1”的值转换为预期的元素类型“33;”]显示在★. 另一种情况是,当按下后退按钮时,第2页(蓝色)消失,同时显示警报表。 (注释掉“Page1(page:self.$page)”,然后构建源代码) 预期的行为是,在按下警报按钮(是)之前,Page2(蓝色)不会消失 有人能告诉我如何解决这些问题吗 import SwiftUI struct PageViewController: UIViewControllerRepresentab

我的代码中有两个问题

一个是编译错误[无法将类型为“Page1”的值转换为预期的元素类型“33;”]显示在★.

另一种情况是,当按下后退按钮时,第2页(蓝色)消失,同时显示警报表。 (注释掉“Page1(page:self.$page)”,然后构建源代码) 预期的行为是,在按下警报按钮(是)之前,Page2(蓝色)不会消失

有人能告诉我如何解决这些问题吗

import SwiftUI

struct PageViewController: UIViewControllerRepresentable {
    var controllers: [UIViewController]
    @Binding var currentPage: Int

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIViewController(context: Context) -> UIPageViewController {
        let pageViewController = UIPageViewController(
            transitionStyle: .pageCurl,
            navigationOrientation: .vertical)
        pageViewController.dataSource = context.coordinator
        pageViewController.delegate = context.coordinator

        return pageViewController
    }

    func updateUIViewController(_ pageViewController: UIPageViewController, context: Context) {
        pageViewController.setViewControllers(
            [controllers[currentPage]], direction: .forward, animated: true)
    }

    class Coordinator: NSObject, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
        var parent: PageViewController

        init(_ pageViewController: PageViewController) {
            self.parent = pageViewController
        }

        func pageViewController(
            _ pageViewController: UIPageViewController,
            viewControllerBefore viewController: UIViewController) -> UIViewController?
        {
            guard let index = parent.controllers.firstIndex(of: viewController) else {
                return nil
            }
            if index == 0 {
                return nil
            }
            return parent.controllers[index - 1]
        }

        func pageViewController(
            _ pageViewController: UIPageViewController,
            viewControllerAfter viewController: UIViewController) -> UIViewController?
        {
            guard let index = parent.controllers.firstIndex(of: viewController) else {
                return nil
            }
            if index + 1 == parent.controllers.count {
                return nil
            }
            return parent.controllers[index + 1]
        }

        func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
            if completed,
                let visibleViewController = pageViewController.viewControllers?.first,
                let index = parent.controllers.firstIndex(of: visibleViewController)
            {
                parent.currentPage = index
            }
        }
    }
}


struct PageView<Page: View>: View {
    var viewControllers: [UIHostingController<Page>]
    @Binding var currentPage: Int

    init(_ views: [Page], currentPage: Binding<Int>) {
        self._currentPage = currentPage
        self.viewControllers = views.map { UIHostingController(rootView: $0) }
    }

    var body: some View {
        PageViewController(controllers: viewControllers, currentPage: $currentPage)
    }
}


struct ContentView: View {
    @State var page: Int = 0

    var body: some View {
        VStack {
            PageView([
                Page1(page: self.$page), // ★ error
                Page2(page: self.$page)// ★ error
            ], currentPage: $page)
        }
    }
}


struct Page1: View{
    @Binding var page: Int
    var body: some View {
        ZStack{
            Color.red
            VStack{
                Text("page1")
                Button (
                    action: { self.page += 1 }
                ){
                    Image(systemName: "forward")
                        .accentColor(Color.yellow)
                }
            }
        }
    }
}


struct Page2: View{
    @State private var showingAlert: Bool = false
    @Binding var page: Int
    var body: some View {
        ZStack{
            Color.blue
            VStack{
                Text("page2")
                Button (
                    action: { self.showingAlert.toggle() }
                ){
                    Image(systemName: "backward")
                        .accentColor(Color.yellow)
                }
            }
            .alert(isPresented: $showingAlert) {
                Alert(
                    title: Text("Confirm"),
                    message: Text("Back?"),
                    primaryButton:
                    .default(Text("Yes"),
                             action:{ self.page -= 1 }
                    ),
                    secondaryButton:
                    .cancel(Text("No"))
                )//alert
            }//alert
        }
    }
}
导入快捷界面
结构PageViewController:UIViewControllerRepresentable{
var控制器:[UIViewController]
@绑定变量currentPage:Int
func makeCoordinator()->Coordinator{
协调员(自我)
}
func makeUIViewController(上下文:context)->UIPageViewController{
让pageViewController=UIPageViewController(
transitionStyle:.pageCurl,
导航方向:。垂直)
pageViewController.dataSource=context.coordinator
pageViewController.delegate=context.coordinator
返回页面视图控制器
}
func updateUIViewController(uPageViewController:UIPageViewController,上下文:上下文){
pageViewController.SetViewController(
[控制器[currentPage]],方向:。正向,动画:真)
}
类协调器:NSObject、UIPageViewControllerDataSource、UIPageViewControllerDelegate{
var父级:PageViewController
初始化(uPageViewController:pageViewController){
self.parent=pageViewController
}
页视图控制器(
_pageViewController:UIPageViewController,
ViewControllerBeforeViewController:UIViewController)->UIViewController?
{
guard let index=parent.controllers.firstIndex(of:viewController)else{
归零
}
如果索引==0{
归零
}
返回父控制器[索引-1]
}
页视图控制器(
_pageViewController:UIPageViewController,
viewControllerAfter viewController:UIViewController)->UIViewController?
{
guard let index=parent.controllers.firstIndex(of:viewController)else{
归零
}
如果索引+1==parent.controllers.count{
归零
}
返回父控制器[索引+1]
}
func pageViewController(pageViewController:UIPageViewController,didFinishAnimating finished:Bool,PreviousViewController:[UIViewController],transitionCompleted completed:Bool){
如果完成,
让visibleViewController=pageViewController.ViewController?。首先,
让index=parent.controllers.firstIndex(of:visibleViewController)
{
parent.currentPage=索引
}
}
}
}
结构页面视图:视图{
var viewControllers:[UIHostingController]
@绑定变量currentPage:Int
初始化(uu视图:[Page],当前页面:绑定){
self.\u currentPage=currentPage
self.viewControllers=views.map{UIHostingController(rootView:$0)}
}
var body:一些观点{
PageViewController(控制器:ViewController,currentPage:$currentPage)
}
}
结构ContentView:View{
@状态变量页:Int=0
var body:一些观点{
VStack{
页面浏览([
第1页(第页:self.$page),//★ 错误
第2页(页码:self.$page)//★ 错误
],当前页:$page)
}
}
}
结构第1页:视图{
@绑定变量页:Int
var body:一些观点{
ZStack{
颜色:红色
VStack{
正文(“第1页”)
钮扣(
操作:{self.page+=1}
){
图像(系统名称:“转发”)
.accentColor(颜色.黄色)
}
}
}
}
}
结构第2页:视图{
@国家私有变量showingAlert:Bool=false
@绑定变量页:Int
var body:一些观点{
ZStack{
蓝色
VStack{
正文(“第2页”)
钮扣(
操作:{self.showinglert.toggle()}
){
图像(系统名称:“向后”)
.accentColor(颜色.黄色)
}
}
.警报(显示:$showingAlert){
警觉的(
标题:文本(“确认”),
信息:文本(“返回?”),
主按钮:
.默认值(文本(“是”),
操作:{self.page-=1}
),
辅助按钮:
.取消(文本(“否”))
)//警觉的
}//警觉的
}
}
}

我可以通过以下方法找到答案:


[如何在SwiftUI中创建入职屏幕#1-嵌入UIPageViewController]()

我可以通过以下方法解决:


[如何在SwiftUI中创建入职屏幕#1-嵌入UIPageViewController]()

像这样使用★ 错误“PageView([AnyView(Page1(page:$page))、AnyView(Page2(page:$page))]、currentPage:$page)”可能有效,但不确定是否只需尝试一次。谢谢!它起作用了。但第二个问题仍然存在。显示警报表时,该行为很奇怪。你知道怎么解决吗?我只是运行你的代码,不知道这个奇怪的行为,但我建议以弹出窗口的形式打开自定义视图,而不是警报。这有助于请对评论进行投票★ 错误“PageView([AnyView(Page1(page:$page))、AnyView(Page2(page:$page))]、currentPage:$page)”可能有效,但不确定是否只需尝试一次。谢谢!它起作用了。但第二个问题仍然存在。当aler