如何快速在 UIPageViewControllers 之间传递数据?

时间:2021-04-20 20:50:32

标签: ios swift uipageviewcontroller

我有一个 UIPageViewController,里面有 4 个视图控制器。在第二个 VC 中,用户输入一些数据。在最后一个 VC 中,有一个按钮,用户可以点击该按钮将这些数据插入到 DB 中。我想将数据从第二个 VC 传递到第四个。我所有的搜索结果都显示了 segue,但 VCs 没有直接连接。

所以我想使用委托,但它对我不起作用。

代码:

UIPageViewController

import UIKit

class PageViewController: UIPageViewController {

var pageControl = UIPageControl()

fileprivate lazy var pages: [UIViewController] = {
    return [
        self.getViewController(withIdentifier: "locationStoryBoard"),
        self.getViewController(withIdentifier: "notificationStoryboard"),
        self.getViewController(withIdentifier: "weightStoryboard"),
        self.getViewController(withIdentifier: "bloodTypeStoryboard"),
        self.getViewController(withIdentifier: "ageStoryboard"),
        self.getViewController(withIdentifier: "genderStoryboard"),
        self.getViewController(withIdentifier: "mobileNumberStoryboard"),
        self.getViewController(withIdentifier: "preventionStoryboard")
    ]
}()

fileprivate func getViewController(withIdentifier identifier: String) -> UIViewController
{
    return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: identifier)
}

override func viewDidLoad()
{
    super.viewDidLoad()
    self.dataSource = self
    self.delegate   = self
    
    if let firstVC = pages.first
    {
        setViewControllers([firstVC], direction: .forward, animated: true, completion: nil)
    }
    configurePageControl()
}

//Page Control (3 dots)
func configurePageControl() {
    pageControl = UIPageControl(frame: CGRect(x: 0,y: UIScreen.main.bounds.maxY - 50,width: UIScreen.main.bounds.width,height: 50))
    self.pageControl.numberOfPages = pages.count
    self.pageControl.currentPage = 0
    self.pageControl.alpha = 0.5
    self.pageControl.tintColor = UIColor.black
    self.pageControl.pageIndicatorTintColor = UIColor.white
    self.pageControl.currentPageIndicatorTintColor = #colorLiteral(red: 0.986409843, green: 0.4042935669, blue: 0.4366002679, alpha: 1)
    self.view.addSubview(pageControl)
}

}

//MARK: - UIPageViewControllerDataSource methods
extension PageViewController: UIPageViewControllerDataSource
{
    func pageViewController(_ pageViewController: UIPageViewController,
                            viewControllerBefore viewController: UIViewController) -> UIViewController? {
        let currentIndex = pages.firstIndex(of: viewController)!
        let previousIndex = currentIndex - 1
        return (previousIndex == -1) ? nil : pages[previousIndex]
    }
    
    func pageViewController(_ pageViewController: UIPageViewController,
                            viewControllerAfter viewController: UIViewController) -> UIViewController? {
        let currentIndex = pages.firstIndex(of: viewController)!
        let nextIndex = currentIndex + 1
        return (nextIndex == pages.count) ? nil : pages[nextIndex]
    }
}

    //MARK: - UIPageViewControllerDelegate methods
    extension PageViewController: UIPageViewControllerDelegate {
        func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
            let pageContentViewController = pageViewController.viewControllers![0]
            self.pageControl.currentPage = pages.firstIndex(of: pageContentViewController)!
        }
    }

First VC

     protocol NameAndMobileDelegates {
             func passName(nameToBePassed: String)
        }
        
    class MobileNumberViewController: UIViewController, UITextFieldDelegate {
        
        var delegate: NameAndMobileDelegates?

    ...



func textFieldDidEndEditing(_ textField: UITextField) {
            switch textField.tag {
            case 1:
                name = textField.text!
                self.delegate?.passName(nameToBePassed: name)
                print(name)
            case 2:
                mobileNumber = textField.text!
                print(mobileNumber)
            default: break
            }
    }

在第 4 个 VC 中:

// MARK: - Name and Number Delegate Methods
extension DiseasesViewController: NameAndMobileDelegates {
    func passName(nameToBePassed: String) {
        print("protocol worked")
    }

提前致谢

1 个答案:

答案 0 :(得分:0)

if let fourVC = pages[3] as? FourthVC {
   fourVC.delegate = pages.first as! FirstVC
 }

然后

class FourthVC:UIViewController {
   weak var delegate:FirstVC?
相关问题