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

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

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

storyboard?.instantiateViewControllerWithIdentifier("editViewController")

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

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

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

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

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

主要问题:

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

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

【问题讨论】:

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

标签: swift delegates uipageviewcontroller


【解决方案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
        }
    

    【讨论】:

      猜你喜欢
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 2017-09-02
      • 2021-10-13
      • 1970-01-01
      相关资源
      最近更新 更多