【问题标题】:SwiftUI send action from a page to the PageViewControllerSwiftUI 将操作从页面发送到 PageViewController
【发布时间】:2020-09-12 10:13:46
【问题描述】:

我在 SwiftUI 中设置了一个PageViewController,遵循已知的教程Interfacing with 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 的协调器?)以及如何访问我需要的对象(例如 currentPage Binding 变量PageViewController)。

比如我在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
    }
}

或者也许我完全错了,仍然从“事件”而不是“声明”的角度思考......

【问题讨论】:

  • 你能在代码中显示你需要调用什么函数吗?
  • 为清晰起见添加了一些代码。

标签: ios swift swiftui uipageviewcontroller uiviewcontrollerrepresentable


【解决方案1】:

好的,我想通了。一开始并不直观,我不得不说。来自传统的基于事件的编程,这是一种完全不同的思维方式

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

我使用@Binding 变量来处理上游(视图控制器、控件)和下游(子视图)的状态。因此,例如,我使用一个变量来告诉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
  • 我还在等待其他建议。
  • 您能告诉我们如何从 Pagecontrolelr 的 ContentView 内的按钮操作移动到下一页吗?
  • @BhuvanBhatt 我编辑了我的答案以提供有关此案例的更多详细信息。
猜你喜欢
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 2020-08-16
相关资源
最近更新 更多