SwiftUI如何从页面向PageViewController发送action

3

我在SwiftUI中设置了一个PageViewController,按照已知的教程与UIKit交互使用了UIViewControllerRepresentable等内容。

我的控制器数组包含简单的SwiftUI视图。我传递一个简单的IntroPage结构体来提供内容。视图是嵌套的,这是良好的SwiftUI实践,如下所示:

PageView
-   IntroScreen                // part of the pages array
    -   VStack 
        -   Text
        -   Image
        -   ButtonView         // a separate view struct
            - HStack
                - ForEach      // iterating through the buttons in my IntroPage Object
                    - Button
PageControl

现在我想在这些视图上添加一些按钮。它们应该可以通过我的IntroPage结构进行配置。其中一个按钮会前往到PageViewController中的下一页,另一个按钮会告诉PageViewController先添加更多页面,另一个按钮则会关闭整个PageViewController。
我无法弄清楚如何访问PageViewController中的这些方法,以及在哪里实现它们(实例视图?PageViewController的协调对象?),以及如何访问我需要的对象(例如,PageViewController的currentPage绑定变量)。
例如,我已经在PageViewController的协调器中实现了一个forward()函数:
func forward() {
   if parent.currentPage < parent.controllers.count - 1 {
       parent.currentPage += 1
   }
}

如果我在最终视图中在PageView旁边添加一个按钮,那么一切都很好,包括动画等等。但是我仍然不能从子视图中包含的按钮调用这个。

有什么想法吗?

编辑:根据要求,在ButtonView中存在此情况。

struct IntroButtonView: View {
    var page: IntroPage
    var body: some View {
        HStack() {
           Button(action:dismiss) {
              Text("LocalizedButtonTitle")
           }
           // ... more buttons, based on certain conditions
        }
    }

    func dismiss() { 
         // how to dismiss the modally presented controller ?
    }

    func next()    { 
         // how to advance to the next page
    }

    func expand()  { 
         // how to add more pages to the pages array
    }
}

或许我完全错误地在以“事件”而不是“声明”为基础来思考......

你能否展示一下代码中需要从哪里到哪里调用函数? - Asperi
为了更清晰,添加了一些代码。 - Mundi
你可以在这里查看我对类似问题的回答:https://dev59.com/wVMH5IYBdhLWcg3w1TuK#70559743 - vicentube
1个回答

2

好的,我明白了。一开始不太直观,我必须得说。由于来自传统的基于事件的编程,这是一种非常不同的思考方式。

我在主视图实例中使用了一个@State变量。

我使用@Binding变量来处理状态,上游(ViewControllers,控件)和下游(子视图)。因此,例如,我使用一个变量告诉UIPageViewControllerdataSource是否在当前视图控制器之前/之后返回视图控制器。

对于解除模态呈现的控制器,我使用了

@Environment(\.presentationMode) var presentationMode

...

func dismiss() {
  self.presentationMode.wrapptedValue.dismiss()
}

同样地,
...
@Binding var currentPage: int
...

Button(action: next) { Text("Next Page") }
...

...
func next() {
    currentPage += 1
}

在决定如何嵌套视图和选择哪些变量进行绑定时,有一些要注意的地方,但现在对我来说已经很清楚了。最大的问题最终是“真相来源”应该锚定在哪里。结果证明,就在“中间”,即控制器下面和特定视图上面。希望这对其他寻找类似内容的人有用。

如果您认为已解决了您的问题,请选择此答案@Mundi。 - user832
我仍在等待其他建议。 - Mundi
你能告诉我如何在PageController中的ContentView内从按钮操作跳转到下一页吗? - Bhuvan Bhatt
1
@BhuvanBhatt 我编辑了我的答案,提供了更多关于这个案例的细节。 - Mundi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接