ios - 如何将数据从 UIPageViewController 传递到它的 "subviews"之一?

标签 ios swift xcode uipageviewcontroller

好的,这是我的问题:

我想通过多个 View Controller 将字符串类型变量的值传递到我的 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 个不同的 View 。我想将 recieveProdTime2 的值传递给 HomeViewController,它是 UIPageViewController 中的 View 之一。这是 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”的标签的文本。

问题

一切顺利,没有错误,项目构建并运行....但是标签的文本是空的!...它只是在模拟器中显示为空标签!我检查了错误框,然后看到这条消息:“警告:尝试在其 View 不在窗口层次结构中的 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
}

关于ios - 如何将数据从 UIPageViewController 传递到它的 "subviews"之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51128519/

相关文章:

ios - Swift tableview numberOfRowsInSection 返回 nil fatal error 可选值

iphone - 我可以在 UIImageView 中编辑 UIImage 的 Alpha Mask 而不必移动太多内存吗?

iphone - 如何在 Swift 中显示 UIImage

ios - Apple M1 芯片上的 Firebase 分析和其他模块

ios - 将付费应用升级为免费应用

ios - Swift 属性字符串清除背景文本

ios - Swift:prepareForSegue 和 instantiateViewController 之间的区别

ios - 使用 CocoaPods 归档 iOS 项目时无法找到模块错误

swift - 绕过自动初始化器继承规则 Swift

ios - 从 JSON 响应中添加动态字段的最佳方式是什么