使用 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 不显示其视图控制器视图
我可以在 Swift 3 项目中使用 Swift 2.3 框架吗?