ios - 如何将数据从 UIPageViewController 传递到它的“子视图”之一?
问题描述
好的,这是我的问题:
我想通过多个视图控制器将字符串类型变量的值传递到我的 UIPageViewController 中的一个页面中。这是 UIPageViewController 的代码(从下面的导入 UIKit 开始):
import UIKit
class PageViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {
var recieveProdTime2 = String() // 2nd view controller for productive time data to pass through
lazy var orderedViewControllers: [UIViewController] = {
return [self.newVC(viewController: "sbHome"), self.newVC(viewController: "sbPoints"), self.newVC(viewController: "sbShop")]
}()
var pageControl = UIPageControl()
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = self
if let firstViewController = orderedViewControllers.first {
setViewControllers([firstViewController],
direction: .forward,
animated: true,
completion: nil)
}
self.delegate = self
configurePageControl()
if recieveProdTime2 != "" {
performSegue(withIdentifier: "segue3", sender: self)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destinationVC = segue.destination as! HomeViewController
destinationVC.productive = recieveProdTime2
}
func configurePageControl() {
pageControl = UIPageControl(frame: CGRect(x: 0, y: UIScreen.main.bounds.maxY - 50, width: UIScreen.main.bounds.width, height: 50))
pageControl.numberOfPages = orderedViewControllers.count
pageControl.currentPage = 0
self.view.addSubview(pageControl)
}
func newVC(viewController: String) -> UIViewController {
return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: viewController)
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard let viewControllerIndex = orderedViewControllers.index(of: viewController) else {
return nil
}
let previousIndex = viewControllerIndex - 1
guard previousIndex >= 0 else {
return orderedViewControllers.last
}
guard orderedViewControllers.count > previousIndex else {
return nil
}
return orderedViewControllers[previousIndex]
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard let viewControllerIndex = orderedViewControllers.index(of: viewController) else {
return nil
}
let nextIndex = viewControllerIndex + 1
guard orderedViewControllers.count != nextIndex else {
return orderedViewControllers.first
}
guard orderedViewControllers.count > nextIndex else {
return nil
}
return orderedViewControllers[nextIndex]
}
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
let pageContentViewController = pageViewController.viewControllers![0]
self.pageControl.currentPage = orderedViewControllers.index(of: pageContentViewController)!
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
如您所见,我正在实例化 3 个不同的视图。我想将recieveProdTime2 的值传递给HomeViewController,它是UIPageViewController 中的视图之一。这是 HomeViewController 的代码:
import UIKit
class HomeViewController: UIViewController {
@IBOutlet weak var focusSession: UILabel!
@IBOutlet weak var breakSession: UILabel!
var productive = String() // Productive time data from ViewController.swift arrives and is store
override func viewDidLoad() {
super.viewDidLoad()
focusSession.text = productive
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
我在 PageViewController 类中使用“prepare(for segue:...)”方法并调用 HomeViewController 类中名为“productive”的变量来设置该类中名为“focusSession”的标签的文本。
问题
一切运行顺利,没有错误,项目构建并运行......但是标签的文本是空的!......它只是在模拟器中显示为一个空标签!我检查了错误框,我看到了这条消息:“警告:尝试在其视图不在窗口层次结构中的 Focus.PageViewController 上呈现 Focus.HomeViewController!”
如何将数据从 PageViewController 发送到 HomeViewController 并正确设置标签的文本???
解决方案
试试这个:
将您的orderedViewControllers
初始化替换为:
lazy var orderedViewControllers: [UIViewController] = {
let sbPoint = self.newVC(viewController: "sbPoints") as! HomeViewController
if recieveProdTime2 != "" {
sbPoint.productive = recieveProdTime2
}
return [self.newVC(viewController: "sbHome"), sbPoint , self.newVC(viewController: "sbShop")]
}()
并在 中输入一些值recieveProdTime2
。在这里你不需要使用prepareForSegue
所以删除:
if recieveProdTime2 != "" {
performSegue(withIdentifier: "segue3", sender: self)
}
和
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destinationVC = segue.destination as! HomeViewController
destinationVC.productive = recieveProdTime2
}
推荐阅读
- php - 将 csv 文件上传到 MySQL 数据库而不逐行插入
- docker - 无法在 Docker 中创建任何容器“无法在本地找到图像 'all:latest'”
- javascript - Gatsby 是否有一些插件或最佳实践来创建使用不同语言的每个构建?
- android - 不同的 Android 屏幕,不同的颜色,我们可以将屏幕编程为看起来相同吗?
- c# - 如何使用 PGPTool 密钥通过 C# 解密文件
- javascript - 单击 ReactJS 检索图像的索引
- javascript - 另一个函数内部的函数只能工作一次
- python - Crashes when moving cellWidgets around in a TableWidget
- postgresql - 使用命令提示符将 dump.sql 导入 Postgres 数据库
- python - Python:如何通过循环将Dataframe中的2列相乘来替换一列中的0值?