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