使用 Swift 在 UIPageViewController 子视图之间传递数据

Posted

技术标签:

【中文标题】使用 Swift 在 UIPageViewController 子视图之间传递数据【英文标题】:Passing data between UIPageViewController Child views with Swift 【发布时间】:2016-04-05 06:51:42 【问题描述】:

我似乎无法为我的直接困境找到一个具体的答案。

我有一个UIPageViewController,它以编程方式加载 6 个子 UIView 场景。它们承载“添加”元素功能的各个阶段。目前PageViewController 类将每个子视图添加到一个数组中,并在需要时实例化它们:

storyboard?.instantiateViewControllerWithIdentifier("editViewController")

自然代理设置为在每个子场景之间滑动,因此不会运行“prepareForSegue”函数。

随着页面的滑动,一个具有不同标识符的新场景被实例化。

根据我的阅读,我现在正在尝试设置一个委托,该委托接受一个字典的实例,它读取/存储来自流程的每个阶段(不同的子 UIPageView 场景)的输入并更新字典。

我正在使用“viewWillDissapear”和“viewWillAppear”方法来帮助设置将数据传递到委托中。

不幸的是,我遇到了问题,由于我缺乏经验,而且对这个具体问题了解不多,我需要帮助!

主要问题:

我可以在UIPageViewController 类中设置一个数据委托,它可以“说话”或者可以被孩子UIViews 访问吗?

有谁知道将我的字典从一个孩子传到另一个孩子的好解决方案????

【问题讨论】:

我有一个类似的问题 - 我想知道如何将数据从 PageViewController 传递给孩子 卢克,我为我遇到的类似问题找到了一个可能对您有用的解决方案 - 将作为答案发布。 我真的放弃尝试使用协议或通知中心,我只是使用 UserDefaults,并且工作得很好 【参考方案1】:

您可以从 child->parent->child 传递数据,而不是从 child->child 传递数据。

首先,当您使用 storyboard?.instantiateViewControllerWithIdentifier("editViewController") 实例化 PageViewController 中的每个子项时,保存对它的引用。

类似

var firstViewController: EditViewController?
...
firstViewController = storyboard?.instantiateViewControllerWithIdentifier("editViewController") as EditViewController

接下来,在每个子 ViewController 中使用 self.parentViewController 获取对 PageViewController 的引用。

var myPageViewController: PageViewContrller (or whatever yours is called) 
....
myPageViewController = self.parentViewController() as PageViewController (or whatever yours is called)

现在,使用这两个引用,您可以调用 PageViewController 和子级中的函数来来回传递数据。

【讨论】:

【参考方案2】:

您应该查看 UIPageViewController 委托 here。

您会在视图控制器之间的转换之前和之后调用这 2 个方法。

- pageViewController:willTransitionToViewControllers: // called before the transition starts
- pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:  // called after the transition is finished

【讨论】:

这些方法真的很有帮助。我们可以获取上一个和下一个 viewController,我们可以调用它们的方法并在类型转换后通过这些方法传递数据【参考方案3】:

很容易从 PageViewController 向它的子节点发送数据而不使用任何 segues

override func viewDidLoad() 
    super.viewDidLoad()
      self.delegate=self
      self.dataSource=self
    let childViewController=storyboard?.instantiateViewController(withIdentifier: "some identifier of view") as! ChildViewController
    if let cid = challengeId
        print("Page Challenge id \(cid)")
    childViewController.challengeId=cid
    

【讨论】:

以上是关于使用 Swift 在 UIPageViewController 子视图之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

UIPageViewController 方向只向前

UIPageViewController 中缺少页面指示

UIPageViewController 不显示其视图控制器视图

我可以在 Swift 3 项目中使用 Swift 2.3 框架吗?

在 swift 项目中集成 swift 框架,都使用 cocoapods

在 Swift 项目中使用 Objective C 类中的 Swift 类